home *** CD-ROM | disk | FTP | other *** search
/ Gigarom 4 / Mac Giga-ROM 4.0 - 1993.toast / FILES / DEV / I-Z / TMON_EVA.cpt / EUA.Asm < prev    next >
Assembly Source File  |  1985-12-24  |  162KB  |  6,962 lines

  1. ;Extended Monitor User Area  (Public Domain - Not For Sale)
  2. ;
  3. ;Written by Darin Adler
  4. ;
  5. ;Based upon the original user area by Waldemar Horwat
  6. ;
  7. ;Portions of this code are Copyright (c) 1985 ICOM Simulations
  8. ;The rest of the code is Copyright (c) 1985 Darin Adler
  9. ;
  10. ;Created:    August 14, 1984
  11. ;Last modified:    December 1, 1985
  12. ;
  13. ;This is for use with Monitor version 2.585, Macintosh ROM version $69.
  14. ;
  15. ;This is an MDS (Consulair) assembler source file.
  16. ;It may have to be modified in order to be used with other assemblers.
  17. ;
  18. ;If you have difficulties with any portion of this code (particularly
  19. ;the "discipline"), send comments or a description of your problem to:
  20. ;
  21. ;    Darin Adler
  22. ;    2765 Marl Oak Dr.
  23. ;    Highland Park, IL  60035
  24. ;
  25. ;Questions, comments or orders for TMON should be directed to:
  26. ;
  27. ;    ICOM Simulations
  28. ;    626 Wheeling Rd.
  29. ;    Wheeling, IL  60090
  30. ;    (312) 520-4440
  31. ;
  32. ;I give many thanks to Waldemar Horwat for writing TMON; to Todd Squires,
  33. ;Jay Zipnick, Craig Erickson, Terry Schulenburg for using and testing the
  34. ;early versions; to Andrew Donoho and the others from Austin who continue
  35. ;to test and make wonderful suggestions; to Steve Capps for the great idea
  36. ;(and code) for "discipline"; and to all the owners of TMON, who know a
  37. ;good thing when they see it!
  38. ;
  39.  
  40.  
  41. AreaSize    EQU    $5500
  42. Version        EQU    652
  43.  
  44.  
  45. ;These are the trap files, etc. for MDS.
  46.  
  47.         INCLUDE    MacTraps.D
  48.  
  49.         INCLUDE    SysEquX.D
  50. JHideCursor    EQU    $800            ;vectors for Hide and Show Cursor (from old SysEqu)
  51. JShowCursor    EQU    $804
  52.  
  53.         INCLUDE FSEqu.D
  54. FSFCBLen    EQU    $3F6            ;length of the FCBs
  55.  
  56.         INCLUDE    ToolEquX.D
  57. nextMap        EQU    16            ;offset from one resource map to the next
  58. resFileID    EQU    20            ;offset to the resource file ID
  59.  
  60.         INCLUDE    QuickEqu.D
  61.  
  62.         INCLUDE    PackMacs.Txt
  63.  
  64.  
  65. ;The following macro is for word aligned, long word values.
  66.  
  67.         MACRO    LONG    value    =
  68.         DC    {value}>>16,{value}&$FFFF
  69.         |
  70.  
  71. ;The next macro is for user area relative word addresses
  72.  
  73.         MACRO    ADDR    address    =
  74.         IF    '{address}'='0'
  75.         DC    0
  76.         ELSE
  77.         IF    '{address}'='.0'
  78.         DC    0
  79.         ELSE
  80.         DC    {address}-A
  81.         ENDIF
  82.         ENDIF
  83.         |
  84.  
  85. ;The following macro is for traps into the monitor.
  86.  
  87.         MACRO    TRAPMon    string    =
  88.         TRAP    #$F
  89. TRAPMon.    SET    *
  90.         DC.B    {string}
  91.         IF    *-TRAPMon. <> 16
  92.         DC.B    0
  93.         ENDIF
  94.         .ALIGN    2
  95.         |
  96.  
  97. ;The next 3 macros are for user area functions.
  98.  
  99.         MACRO    UAFunc    name,next    =
  100. .{name}
  101.         ADDR    .{next}
  102.         ADDR    {name}
  103.         DC.B    .{name}.1-*-1
  104.         |
  105.         MACRO    UAParam    name,parms    =
  106. .{name}.1
  107.         .ALIGN    2
  108.         DC.B    {parms}
  109.         DC.B    .{name}.2-*-1
  110.         |
  111.         MACRO    UACode    name        =
  112. .{name}.2
  113.         .ALIGN    2
  114. {name}
  115.         |
  116.  
  117.  
  118. ;These are the equates for the extended ASCII used in names.
  119.  
  120. End.If        EQU    $00
  121. If.Else        EQU    $01
  122. If.Pos        EQU    $02
  123. If.Neg        EQU    $03
  124. Colon        EQU    $04
  125. Skip        EQU    $04 ;+1 to +10
  126. PrHex        EQU    $0E ;+1 to +8
  127. PrASCII        EQU    $16 ;+1 to +8
  128. NoOp        EQU    $1F
  129. DisAsm0        EQU    $80
  130. DisAsm1        EQU    $81
  131. Recognize    EQU    $82
  132.  
  133.  
  134. ;These are some useful Monitor routines.
  135.  
  136. _Print1        EQU     -8(A5)
  137. _ExiTMON    EQU    -12(A5)
  138. _Print2        EQU    -20(A5)
  139. _PutASCII    EQU    -24(A5)
  140. _Put1Dig    EQU    -28(A5)
  141. _Put2Dig    EQU    -32(A5)
  142. _Put4Dig    EQU    -36(A5)
  143. _Put6Dig    EQU    -40(A5)
  144. _Put8Dig    EQU    -44(A5)
  145. _NextCResFile    EQU    -48(A5)
  146. _FindRes    EQU    -52(A5)
  147. _Recognize    EQU    -56(A5)
  148.  
  149.  
  150. ;These are some of the monitor's variables
  151.  
  152. MonExecuting.A5    EQU    $15(A5)
  153. PC.A5        EQU    $4E(A5)
  154. D0.A5        EQU    $60(A5)
  155. A0.A5        EQU    $80(A5)
  156. SP.A5        EQU    $94(A5)
  157. N.A5        EQU    $98(A5)
  158. V.A5        EQU    $9C(A5)
  159. V.A2        EQU    $9C(A2)
  160.  
  161. A5.TMON        EQU    *-$500            ;Monitor globals relative to the user area.
  162. MonExecuting    EQU    $15+A5.TMON        ;This is the monitor status byte.
  163. UserInform    EQU    $207+A5.TMON
  164. TMONStart    EQU    $FC            ;The contents of this point to the bottom of TMON.
  165.  
  166.  
  167.         ;#################
  168.         ;##             ##
  169.         ;##  User Area  ##
  170.         ;##             ##
  171.         ;#################
  172.  
  173.  
  174. A
  175.  
  176. ;This is the start of the user area.  See the TMON manual for details on the first 32 bytes.
  177.  
  178.  
  179. _AreaSize    DC    AreaSize        ;The size of the user area.
  180. _Version    DC    Version            ;The current version number.
  181. _FlagWord    DC.B    %10010000        ;Refresh and screen size. (Auto-Quit and no Vector Refresh)
  182. _Inhibits    DC.B    %00000000        ;Heap, label, and screen inhibit flags.
  183. _PortConfig    DC    %0000000000000010    ;Printer port, DTR handshake.
  184. _PortRate    DC    %1100110000001010    ;9600 baud, 8 data bits, 2 stop, no parity.
  185. _A000Hook    ADDR    A000Hook        ;The A000 hook.
  186. _PrintError    ADDR    PrintError        ;The error location.
  187. _FirstUAFunc    ADDR    .Toggle            ;The first user routine.
  188. _HeapHook    ADDR    HeapHook        ;The heap window hook.
  189. _InitHook    ADDR    InitHook        ;User initialization routine.
  190. _EnterHook    ADDR    EnterHook        ;User enter routine.
  191. _ExitHook    ADDR    ExitHook        ;User exit routine.
  192. _LabelScan    ADDR    LabelScan        ;User label table scanning routine.
  193. _CodeLabelScan    ADDR    CodeLabelScan        ;User label-in-code scanning routine.
  194. _LabelFind    ADDR    LabelFind        ;User routine to find label in table.
  195. _CodeLabelFind    ADDR    CodeLabelFind        ;User routine to find label in code.
  196. _Reserved    DC    0,0,0,0,0,0,0,0        ;Reserved for future use.
  197.  
  198.  
  199. nasty0        LONG    'NIL!'            ;Something nasty for location 0.
  200. val10000    LONG    $10000            ;A useful constant.
  201. updating    LONG    0            ;A record of the last window that called BeginUpdate.
  202.  
  203.  
  204. InitHook
  205.         TST.L    D0            ;Is this the first call to InitHook?
  206.         BNE.S    EveryInit
  207. FirstInit
  208.         BSR    GetTrapAddressPatch    ;Patch fo fix incompatibility with HyperDrive 20
  209.         BSR    AppleTalkPatch        ;Patch to fix incompatibility with AppleTalk interface code.
  210.         BSR    DebuggerInit        ;Redefine the _Debugger trap.
  211.         BSR    DebuggerPatch        ;Fix up TMON's detection of the _Debugger opcode.
  212.         BSR    SeeThroughPatch        ;Fix up the fancy screen.
  213. EveryInit
  214.         BSR    A000OnOff        ;Check if we need to wire in A000 traps.
  215.         BSR    ChecksumInit        ;Calculate an initial value for the checksum.
  216.         BSR    FreeFormPatch        ;Patch to fix a bug in Free Form sound.
  217.         BSR    SaveMemTop        ;Get the "real" MemTop.
  218.         BSR    DisciplineInit        ;Initialize the discipline code.
  219.         MOVE.L    nasty0,0        ;Trash location zero.
  220.         RTS
  221.  
  222.  
  223. EnterHook
  224.         BSR    CursorEnter        ;Play games with the cursor.
  225.         BSR    RecordEnter        ;Make 'Trap Record' seem continuous.
  226.         RTS
  227.  
  228.  
  229. ExitHook
  230.         BSR    CursorExit        ;Play games with the cursor.
  231.         BSR    RecordExit        ;Make 'Trap Record' seem continuous.
  232.         MOVE.L    nasty0,0        ;Trash location zero.
  233.         RTS
  234.  
  235.  
  236. HeapHook
  237.         BSR    HeapIdentify
  238.         RTS
  239.  
  240.  
  241.         ;#################################
  242.         ;##                             ##
  243.         ;##  User Area Built-In Labels  ##
  244.         ;##                             ##
  245.         ;#################################
  246.  
  247.  
  248. ;
  249. ;This is the label table built into the user area.
  250. ;
  251.  
  252. UALabelTable
  253.  
  254.         MACRO    Label    first,last,name    =
  255.         LONG    {first}
  256.         LONG    {last}
  257. Label.        SET    *
  258.         DC.B    '{name|0:8}'
  259.         DCB.B    Label.+8-*,$20
  260.         |
  261.  
  262.         ;To add labels to this table simply add blocks of 16 bytes
  263.         ;(labels as described in the manual) between the UALabelTable
  264.         ;label and the UALabelTableEnd label.
  265.  
  266.         Label      $8,  $C,BusError
  267.         Label      $C, $10,AddrErr
  268.         Label     $10, $14,Illegal
  269.         Label     $14, $18,ZeroDiv
  270.         Label     $18, $1C,ChkError
  271.         Label     $1C, $20,TrapVErr
  272.         Label     $20, $24,Privileg
  273.         Label     $24, $28,Trace
  274.         Label     $28, $2C,Line1010
  275.         Label     $2C, $30,Line1111
  276.         Label     $34, $38,Coproces
  277.         Label     $38, $3C,FormatEr
  278.         Label     $3C, $40,Uninited
  279.         Label     $60, $64,Spurious
  280.         Label     $64, $68,AutoInt1
  281.         Label     $68, $6C,AutoInt2
  282.         Label     $6C, $70,AutoInt3
  283.         Label     $70, $74,AutoInt4
  284.         Label     $74, $78,AutoInt5
  285.         Label     $78, $7C,AutoInt6
  286.         Label     $7C, $80,AutoInt7
  287.         Label     $80, $C0,TRAPtble
  288.         Label    $100,$102,MonkeyLives
  289.         Label    $102,$104,ScrVRes
  290.         Label    $104,$106,ScrHRes
  291.         Label    $106,$108,ScreenRow
  292.         Label    $108,$10C,MemTop
  293.         Label    $10C,$110,BufPtr
  294.         Label    $110,$114,StkLowPt
  295.         Label    $114,$118,HeapEnd
  296.         Label    $118,$11C,TheZone
  297.         Label    $11C,$120,UTableBase
  298.         Label    $120,$124,MacJmp
  299.         Label    $124,$128,DskRtnAdr
  300.         Label    $128,$12C,PollRtnAddr
  301.         Label    $12C,$12D,DskVerify
  302.         Label    $12D,$12E,LoadTrap
  303.         Label    $12E,$12F,MmInOK
  304.         Label    $12F,$130,DiskWr11
  305.         Label    $130,$134,ApplLimit
  306.         Label    $134,$138,SonyVars
  307.         Label    $138,$13A,PWMValue
  308.         Label    $13A,$13E,PollStack
  309.         Label    $13E,$142,PollProc
  310.         Label    $142,$144,DskErr
  311.         Label    $144,$146,SysEvtMask
  312.         Label    $146,$14A,SysEvtBuf
  313.         Label    $14A,$154,EventQueue
  314.         Label    $154,$156,EvtBufCnt
  315.         Label    $156,$15A,RndSeed
  316.         Label    $15A,$15C,SysVersion
  317.         Label    $15C,$15D,SEvtEnb
  318.         Label    $15D,$15E,DSWndUpdate
  319.         Label    $15E,$15F,FontFlag
  320.         Label    $15F,$160,IntFlag
  321.         Label    $160,$16A,VBLQueue
  322.         Label    $16A,$16E,Ticks
  323.         Label    $16E,$172,MBTicks
  324.         Label    $172,$173,MBState
  325.         Label    $173,$174,Tocks
  326.         Label    $174,$17C,KeyMap
  327.         Label    $17C,$184,KeypadMap
  328.         Label    $184,$186,KeyLast
  329.         Label    $186,$18A,KeyTime
  330.         Label    $18A,$18E,KeyRepTime
  331.         Label    $18E,$190,KeyThresh
  332.         Label    $190,$192,KeyRepThresh
  333.         Label    $192,$1B2,Lvl1DT
  334.         Label    $1B2,$1D2,Lvl2DT
  335.         Label    $1D2,$1D4,UnitNtryCnt
  336.         Label    $1D4,$1D8,VIA
  337.         Label    $1D8,$1DC,SCCRd
  338.         Label    $1DC,$1E0,SCCWr
  339.         Label    $1E0,$1E4,IWM
  340.         Label    $1E4,$1F8,scratch20
  341.         Label    $1F8,$1F9,SPValid
  342.         Label    $1F9,$1FA,SPATalkA
  343.         Label    $1FA,$1FB,SPATalkB
  344.         Label    $1FB,$200,SPConfig
  345.         Label    $200,$204,SPAlarm
  346.         Label    $204,$206,SPFont
  347.         Label    $206,$207,SPKbd
  348.         Label    $207,$208,SPPrint
  349.         Label    $208,$209,SPVolCtl
  350.         Label    $209,$20A,SPClikCaret
  351.         Label    $20A,$20B,SPMisc1
  352.         Label    $20B,$20C,SPMisc2
  353.         Label    $1F8,$20C,SysParam
  354.         Label    $20C,$210,Time
  355.         Label    $210,$212,BootDrive
  356.         Label    $212,$214,JShell
  357.         Label    $214,$216,SFSaveDisk
  358.         Label    $216,$21A,KbdVars
  359.         Label    $21A,$21E,JKybdTask
  360.         Label    $21E,$21F,KbdType
  361.         Label    $21F,$220,AlarmState
  362.         Label    $220,$222,MemError
  363.         Label    $222,$226,JFlgTrkSpd
  364.         Label    $226,$22A,JDiskPrime
  365.         Label    $22A,$22E,JRdAddr
  366.         Label    $22E,$232,JRdData
  367.         Label    $232,$236,JWrData
  368.         Label    $236,$23A,JSeek
  369.         Label    $23A,$23E,JSetUpPoll
  370.         Label    $23E,$242,JRecal
  371.         Label    $242,$246,JControl
  372.         Label    $246,$24A,JWakeUp
  373.         Label    $24A,$24E,JReSeek
  374.         Label    $24E,$252,JMakeSpdTbl
  375.         Label    $252,$256,JAdrDisk
  376.         Label    $256,$25A,JSetSpeed
  377.         Label    $25A,$25E,NiblTbl
  378.         Label    $222,$260,DiskVars
  379.         Label    $260,$261,SdVolume
  380.         Label    $261,$262,Finder
  381.         Label    $262,$266,SoundPtr
  382.         Label    $266,$26A,SoundBase
  383.         Label    $26A,$27A,SoundVBL
  384.         Label    $27A,$27E,SoundDCE
  385.         Label    $27E,$27F,SoundActive
  386.         Label    $27F,$280,SoundLevel
  387.         Label    $280,$282,CurPitch
  388.         Label    $282,$28A,Switcher
  389.         Label    $28A,$28E,RSDHndl
  390.         Label    $28E,$290,ROM85
  391.         Label    $290,$291,PortAUse
  392.         Label    $291,$292,PortBUse
  393.         Label    $292,$29A,ScreenVars
  394.         Label    $29A,$29E,JGNEFilter
  395.         Label    $29E,$2A2,Key1Trans
  396.         Label    $2A2,$2A6,Key2Trans
  397.         Label    $2A6,$2AA,SysZone
  398.         Label    $2AA,$2AE,ApplZone
  399.         Label    $2AE,$2B2,ROMBase
  400.         Label    $2B2,$2B6,RAMBase
  401.         Label    $2B6,$2BA,BasicGlob
  402.         Label    $2BA,$2BE,DSAlertTab
  403.         Label    $2BE,$2CE,ExtStsDT
  404.         Label    $2CE,$2CF,SCCASts
  405.         Label    $2CF,$2D0,SCCBSts
  406.         Label    $2D0,$2D8,SerialVars
  407.         Label    $2DC,$2E0,ABusDCE
  408.         Label    $2D8,$2E0,ABusVars
  409.         Label    $2E0,$2F0,FinderName
  410.         Label    $2F0,$2F4,DoubleTime
  411.         Label    $2F4,$2F8,CaretTime
  412.         Label    $2F8,$2F9,ScrDmpEnb
  413.         Label    $2F9,$2FA,ScrDmpType
  414.         Label    $2FA,$2FC,TagData
  415.         Label    $2FC,$300,BufTgFNum
  416.         Label    $300,$302,BufTgFFlg
  417.         Label    $302,$304,BufTgFBkNum
  418.         Label    $304,$308,BufTgDate
  419.         Label    $308,$312,DrvQHdr
  420.         Label    $312,$316,PWMBuf2
  421.         Label    $316,$31A,MacPgm
  422.         Label    $31A,$31E,Lo3Bytes
  423.         Label    $31E,$322,MinStack
  424.         Label    $322,$326,DefltStack
  425.         Label    $326,$328,MMDefFlags
  426.         Label    $328,$32C,GZRootHnd
  427.         Label    $32C,$330,GZRootPtr
  428.         Label    $330,$334,GZMoveHnd
  429.         Label    $334,$338,DSDrawProc
  430.         Label    $338,$33C,EjectNotify
  431.         Label    $33C,$340,IAZNotify
  432.         Label    $340,$342,CkdDB
  433.         Label    $342,$344,NxtDB
  434.         Label    $344,$346,MaxDB
  435.         Label    $346,$347,FlushOnly
  436.         Label    $347,$348,RegRsrc
  437.         Label    $348,$349,FLckUnlck
  438.         Label    $349,$34A,FrcSync
  439.         Label    $34A,$34C,NewMount
  440.         Label    $34C,$34E,DrMstrBlk
  441.         Label    $34E,$352,FCBSPtr
  442.         Label    $352,$356,DefVCBPtr
  443.         Label    $356,$360,VCBQHdr
  444.         Label    $360,$362,FSBusy
  445.         Label    $362,$366,FSQHead
  446.         Label    $366,$36A,FSQTail
  447.         Label    $360,$36A,FSQHdr
  448.         Label    $36A,$3A2,RgSvArea
  449.         Label    $3A2,$3A4,ErCode
  450.         Label    $3A4,$3D6,Params
  451.         Label    $3D6,$3DE,FSTemp8
  452.         Label    $3DE,$3E2,FSTemp4
  453.         Label    $3E2,$3E6,FSQueueHook
  454.         Label    $3E6,$3EA,ExtFSHook
  455.         Label    $3EA,$3EE,DskSwtchHook
  456.         Label    $3EE,$3F2,ReqstVol
  457.         Label    $3F2,$3F6,ToExtFS
  458.         Label    $3F6,$3F8,FSFCBLen
  459.         Label    $3F8,$400,DSAlertRect
  460.         Label    $400,$800,DispatchTab
  461.         Label    $800,$804,JHideCursor
  462.         Label    $804,$808,JShowCursor
  463.         Label    $808,$80C,JShieldCursor
  464.         Label    $80C,$810,JScrnAddr
  465.         Label    $810,$814,JScrnSize
  466.         Label    $814,$818,JInitCrsr
  467.         Label    $818,$81C,JSetCrsr
  468.         Label    $81C,$820,JCrsrObscure
  469.         Label    $820,$824,JUpdateProc
  470.         Label    $824,$828,ScrnBase
  471.         Label    $828,$82C,MTemp
  472.         Label    $82C,$830,RawMouse
  473.         Label    $830,$834,Mouse
  474.         Label    $834,$83C,CrsrPin
  475.         Label    $83C,$844,CrsrRect
  476.         Label    $844,$888,TheCrsr
  477.         Label    $888,$88C,CrsrAddr
  478.         Label    $88C,$8CC,CrsrSave
  479.         Label    $8CC,$8CD,CrsrVis
  480.         Label    $8CD,$8CE,CrsrBusy
  481.         Label    $8CE,$8CF,CrsrNew
  482.         Label    $8CF,$8D0,CrsrCouple
  483.         Label    $8D0,$8D2,CrsrState
  484.         Label    $8D2,$8D3,CrsrObscure
  485.         Label    $8D3,$8D4,CrsrScale
  486.         Label    $8D6,$8DA,MouseMask
  487.         Label    $8DA,$8DE,MouseOffset
  488.         Label    $8DE,$8E0,JournalFlag
  489.         Label    $8E0,$8E4,JSwapFont
  490.         Label    $8E4,$8E8,JFontInfo
  491.         Label    $8E8,$8EC,JournalRef
  492.         Label    $8EC,$8EE,CrsrThresh
  493.         Label    $8EE,$8F2,JCrsrTask
  494.         Label    $8F2,$8F3,WWExist
  495.         Label    $8F3,$8F4,QDExist
  496.         Label    $8F4,$8F8,JFetch
  497.         Label    $8F8,$8FC,JStash
  498.         Label    $8FC,$900,JIODone
  499.         Label    $900,$902,CurApRefnum
  500.         Label    $902,$903,LaunchFlag
  501.         Label    $904,$908,CurrentA5
  502.         Label    $908,$90C,CurStack
  503.         Label    $910,$930,CurApName
  504.         Label    $930,$934,SaveSegHandle
  505.         Label    $934,$936,CurJTOffset
  506.         Label    $936,$938,CurPageOption
  507.         Label    $93A,$944,LoaderPBlock
  508.         Label    $900,$944,LoadVars
  509.         Label    $944,$946,PrintErr
  510.         Label    $946,$947,ChooserBits
  511.         Label    $944,$954,PrintVars
  512.         Label    $954,$960,CoreEdit
  513.         Label    $960,$964,scrapSize
  514.         Label    $964,$968,scrapHandle
  515.         Label    $968,$96A,scrapCount
  516.         Label    $96A,$96C,scrapState
  517.         Label    $96C,$970,scrapName
  518.         Label    $970,$980,ScrapTag
  519.         Label    $960,$980,ScrapVars
  520.         Label    $980,$984,RomFont0
  521.         Label    $984,$986,ApFontID
  522.         Label    $986,$987,GotStrike
  523.         Label    $987,$988,FMDefaultSize
  524.         Label    $988,$98A,CurFMFamily
  525.         Label    $98A,$98C,CurFMSize
  526.         Label    $98C,$98D,CurFMFace
  527.         Label    $98D,$98E,CurFMNeedBits
  528.         Label    $98E,$990,CurFMDevice
  529.         Label    $990,$994,CurFMNumer
  530.         Label    $994,$998,CurFMDenom
  531.         Label    $988,$998,CurFMInput
  532.         Label    $998,$99A,FOutError
  533.         Label    $99A,$99E,FOutFontHandle
  534.         Label    $99E,$99F,FOutBold
  535.         Label    $99F,$9A0,FOutItalic
  536.         Label    $9A0,$9A1,FOutULOffset
  537.         Label    $9A1,$9A2,FOutULShadow
  538.         Label    $9A2,$9A3,FOutULThick
  539.         Label    $9A3,$9A4,FOutShadow
  540.         Label    $9A4,$9A5,FOutExtra
  541.         Label    $9A5,$9A6,FOutAscent
  542.         Label    $9A6,$9A7,FOutDescent
  543.         Label    $9A7,$9A8,FOutWidMax
  544.         Label    $9A8,$9A9,FOutLeading
  545.         Label    $9A9,$9AA,FOutUnused
  546.         Label    $9AA,$9AE,FOutNumeer
  547.         Label    $9AE,$9B2,FOutDenom
  548.         Label    $998,$9B2,FOutRec
  549.         Label    $9B2,$9B6,FMDotsPerInch
  550.         Label    $9B6,$9CE,FMStyleTab
  551.         Label    $9CE,$9D6,ToolScratch
  552.         Label    $9D6,$9DA,WindowList
  553.         Label    $9DA,$9DC,SaveUpdate
  554.         Label    $9DC,$9DE,PaintWhite
  555.         Label    $9DE,$9E2,WMgrPort
  556.         Label    $9E2,$9E6,DeskPort
  557.         Label    $9E6,$9EA,OldStructure
  558.         Label    $9EA,$9EE,OldContent
  559.         Label    $9EE,$9F2,GrayRgn
  560.         Label    $9F2,$9F6,SaveVisRgn
  561.         Label    $9F6,$9FA,DragHook
  562.         Label    $9FA,$A02,scratch8
  563.         Label    $A02,$A06,OneOne
  564.         Label    $A06,$A0A,MinusOne
  565.         Label    $A0E,$A1C,IconBitmap
  566.         Label    $A1C,$A20,MenuList
  567.         Label    $A20,$A22,MBarEnable
  568.         Label    $A22,$A24,CurDeKind
  569.         Label    $A24,$A26,MenuFlash
  570.         Label    $A26,$A28,TheMenu
  571.         Label    $A28,$A2C,SavedHandle
  572.         Label    $A2C,$A30,MBarHook
  573.         Label    $A30,$A34,MenuHook
  574.         Label    $A34,$A3C,DragPattern
  575.         Label    $A3C,$A44,DeskPattern
  576.         Label    $A44,$A46,DragFlag
  577.         Label    $A46,$A4A,CurDragAction
  578.         Label    $A4A,$A50,FPState
  579.         Label    $A50,$A54,TopMapHndl
  580.         Label    $A54,$A58,SysMapHndl
  581.         Label    $A58,$A5A,SysMap
  582.         Label    $A5A,$A5C,CurMap
  583.         Label    $A5C,$A5E,ResReadOnly
  584.         Label    $A5E,$A60,ResLoad
  585.         Label    $A60,$A62,ResErr
  586.         Label    $A62,$A63,TaskLock
  587.         Label    $A63,$A64,FScaleDisable
  588.         Label    $A64,$A68,CurActivate
  589.         Label    $A68,$A6C,CurDeactive
  590.         Label    $A6C,$A70,DeskHook
  591.         Label    $A70,$A74,TEDoText
  592.         Label    $A74,$A78,TERecal
  593.         Label    $A78,$A84,ApplScratch
  594.         Label    $A84,$A88,GhostWindow
  595.         Label    $A88,$A8C,CloseOrnHook
  596.         Label    $A8C,$A90,ResumeProc
  597.         Label    $A90,$A94,SaveProc
  598.         Label    $A94,$A98,SaveSP
  599.         Label    $A98,$A9A,ANumber
  600.         Label    $A9A,$A9C,ACount
  601.         Label    $A9C,$AA0,DABeeper
  602.         Label    $AA0,$AB0,DAStrings
  603.         Label    $AB0,$AB2,TEScrpLength
  604.         Label    $AB4,$AB8,TEScrpHandle
  605.         Label    $AB8,$AD8,AppPacks
  606.         Label    $AD8,$AE8,SysResName
  607.         Label    $AEC,$AF0,AppParmHandle
  608.         Label    $AF0,$AF2,DSErrCode
  609.         Label    $AF2,$AF6,ResErrProc
  610.         Label    $AF6,$AFA,TEWdBreak
  611.         Label    $AFA,$AFC,DlgFont
  612.  
  613. UALabelTableEnd
  614.  
  615. NumUALabels    EQU    (UALabelTableEnd-UALabelTable)/16
  616.  
  617.  
  618.         ;###########################
  619.         ;##                       ##
  620.         ;##  User Area functions  ##
  621.         ;##                       ##
  622.         ;###########################
  623.  
  624.  
  625. ;
  626. ;The following is the first function in the user area.
  627. ;It is used to link between two different sets of UA functions.
  628. ;
  629.  
  630.     UAFunc    Toggle,BlockMove
  631.         DC.B    'Toggle screens {'
  632.         DC.B    If.Pos
  633.         DC.B      'generic'
  634.         DC.B    If.Else
  635.         DC.B      'heap, label and A000 trap'
  636.         DC.B    End.If
  637.         DC.B    ' functions}'
  638.     UAParam    Toggle,%00001
  639.         DC.B    0
  640.     UACode    Toggle
  641.         NOT.B    (A0)
  642.         BEQ.S    @1
  643.         MOVE.W    #.LabelTableSet-A,.Toggle-A(A2)
  644.         RTS
  645. @1        MOVE.W    #.BlockMove-A,.Toggle-A(A2)
  646.         RTS
  647.  
  648.  
  649. ;The 1st user area screen starts here
  650.  
  651.  
  652.     UAFunc    BlockMove,BlockCompare
  653.         DC.B    'Block move (src dst len)'
  654.     UAParam    BlockMove,%01000
  655.     UACode    BlockMove
  656.         MOVE.L    D0,A0            ;Call the ROM _BlockMove routine.
  657.         MOVE.L    D1,A1
  658.         MOVE.L    D2,D0
  659.         _BlockMove
  660.         RTS
  661.  
  662.  
  663.     UAFunc    BlockCompare,BlockFill
  664.         DC.B    'Block compare {'
  665.         DC.B    If.Neg
  666.         DC.B      Skip+9
  667.         DC.B    If.Else
  668.         DC.B      If.Neg
  669.         DC.B        'Match',Skip+8
  670.         DC.B      If.Else
  671.         DC.B        'Mismatch at ',Skip+1,PrHex+6,'/',Skip+1,PrHex+6
  672.         DC.B      End.If
  673.         DC.B    End.If
  674.         DC.B    '} (adr1 adr2 len)',Colon
  675.         DC.B    If.Pos
  676.         DC.B      PrHex+6,' ',Skip+1,PrHex+6,' ',Skip+1,PrHex+6
  677.     UAParam    BlockCompare,%01001
  678.         DC    $FF00
  679.         LONG    -1
  680.         LONG    -1
  681.         LONG    -1
  682.         LONG    -1
  683.         LONG    -1
  684.     UACode    BlockCompare
  685.         TST.B    D7            ;No parameters?
  686.         BEQ.S    @2            ;It's a "match"
  687.         TST.L    D2            ;Is the length zero or negative?
  688.         BLE.S    @2            ;YES.  All zero-length areas "match".
  689.         BSR    AddressCheck
  690.         MOVEM.L    D0/D1/D2,10(A0)        ;Save the current values.
  691.         MOVE.L    D0,A1
  692.         MOVE.L    D1,A2
  693.         SUBQ.L    #1,D2
  694. @1        CMPM.B    (A1)+,(A2)+        ;Compare one byte.
  695.         DBNE    D2,@1
  696.         BNE.S    Mismatch        ;A mismatch.
  697.         SUB.L    val10000,D2        ;This is the compare outer loop.
  698.         BCC.S    @1
  699. @2        SCC    10(A0)            ;Flag whether a comparison is going.
  700.         SCC    (A0)+
  701.         ST    (A0)            ;The blocks match.
  702.         RTS
  703.  
  704. Mismatch
  705.         CLR.W    (A0)+            ;Flag a mismatch.
  706.         SUBQ.W    #1,A1            ;Pass back the address of the mismatch.
  707.         MOVE.L    A1,(A0)+
  708.         BSR    StoreV
  709.         SUBQ.W    #1,A2
  710.         MOVE.L    A2,(A0)+
  711. @1        CMPM.B    (A1)+,(A2)+        ;Now search for another match.
  712.         DBEQ    D2,@1
  713.         BEQ.S    @2            ;A match.
  714.         SUB.L    val10000,D2        ;This is the compare outer loop.
  715.         BCC.S    @1
  716.         BRA.S    @3
  717. @2        SUBQ.W    #1,A1            ;Move the pointers back one byte.
  718.         SUBQ.W    #1,A2
  719. @3        ADDQ.L    #1,D2
  720.         MOVE.L    A1,(A0)+        ;Save the pointers and the new count for the user's
  721.         MOVE.L    A2,(A0)+        ;convenience.
  722.         MOVE.L    D2,(A0)
  723.         RTS
  724.  
  725.  
  726.     UAFunc    BlockFill,Search
  727.         DC.B    'Fill (bgn end val [vLen])'
  728.     UAParam    BlockFill,%11000
  729.     UACode    BlockFill
  730.         LSR.B    #1,D7
  731.         BCC.S    @1
  732.         BSR.S    Measure            ;Find the size of the item.
  733. @1        MOVEQ    #%10110,D6
  734.         BSR.S    MeasureCheck
  735.         MOVE.L    D2,D4
  736.         SUBQ.B    #2,D3
  737.         BEQ.S    @2            ;Do a word fill.
  738.         BCC.S    @3            ;Do a longword fill.
  739.         LSL.W    #8,D4            ;Do a byte fill.  Copy the byte into both the low
  740.         MOVE.B    D2,D4            ;and high order bytes of the low word in D2.
  741.         MOVE.W    D4,D2
  742. @2        SWAP    D2            ;Copy the word into both the low and high order
  743.         MOVE.W    D4,D2            ;words in D2.
  744. @3        SUB.L    D0,D1            ;If the ending address is lower than the beginning
  745.         BLT.S    @5            ;address, exit.
  746.         MOVE.L    D0,A0
  747. @4        ROL.L    #8,D2            ;Shift the next byte into position, and put it into
  748.         MOVE.B    D2,(A0)+        ;the destination.
  749.         DBRA    D1,@4
  750.         SUB.L    val10000,D1        ;This is a continuation of the loop.
  751.         BCC.S    @4
  752. @5        RTS
  753.  
  754.  
  755. Measure
  756.         MOVEQ    #1,D4
  757.         MOVEQ    #0,D3
  758. @1        ADDQ.W    #1,D3            ;Compare the value against $100, $10000, and
  759.         ROL.L    #8,D4            ;$1000000.  Estimate the length based on the
  760.         CMP.L    D4,D2            ;results.
  761.         BCS.S    @2
  762.         CMP.W    #4,D3
  763.         BCS.S    @1
  764. @2        RTS
  765.  
  766.  
  767. MeasureCheck
  768.         MOVEQ    #4,D4            ;D4 contains the constant 4.
  769.         CMP.L    D4,D3            ;The length can't be greater than four.
  770.         BLS.S    @1
  771.         MOVE.L    D5,D3
  772. @1        BTST    D3,D6            ;The length has to be within the requested range.
  773.         BNE.S    AddressCheck
  774.         ADDQ.B    #1,D3
  775.         BRA.S    @1
  776.  
  777.  
  778. AddressCheck
  779.         AND.L    Lo3Bytes,D0        ;Strip the high bytes from the addresses.
  780.         AND.L    Lo3Bytes,D1
  781.         RTS
  782.  
  783.  
  784.     UAFunc    Search,RegisterBuffer
  785.         DC.B    'Find {'
  786.         DC.B    If.Neg
  787.         DC.B      'byte'
  788.         DC.B    If.Else
  789.         DC.B      'word'
  790.         DC.B    End.If
  791.         DC.B    ' aligned} {'
  792.         DC.B    If.Neg
  793.         DC.B      Skip+4
  794.         DC.B    If.Else
  795.         DC.B      Skip+1,PrHex+6
  796.         DC.B    End.If
  797.         DC.B    '} (val [vLen [bgn [end]]])',Colon
  798.         DC.B    If.Pos
  799.         DC.B      Skip+1,PrHex+8,' '
  800.         DC.B      If.Pos
  801.         DC.B        PrHex+1,' '
  802.         DC.B        If.Pos
  803.         DC.B          PrHex+6,' ',Skip+1,PrHex+6
  804.     UAParam    Search,%11111
  805.         DC    $FFFF
  806.         LONG    0
  807.         DC    $FF00
  808.         LONG    0
  809.         DC    $FF00
  810.         LONG    -1
  811.         LONG    -1
  812.     UACode    Search
  813.         TST.B    D7            ;If just a RETURN was pressed, toggle between byte
  814.         BNE.S    @1            ;and word aligned search.
  815.         NOT.B    (A0)
  816.         RTS
  817. @1        EXG    D0,D2
  818.         EXG    D1,D3
  819.         SUBQ.B    #1,D7            ;If vLen wasn't given, calculate it.
  820.         BNE.S    @2
  821.         BSR    Measure
  822. @2        MOVEQ    #%11110,D6        ;vLen can be 1..4 for byte-aligned searches and 2
  823.         TST.B    (A0)+            ;or 4 for word-aligned searches.
  824.         BNE.S    @3
  825.         MOVEQ    #%10100,D6
  826. @3        BSR    MeasureCheck
  827.         SUBQ.B    #3,D7            ;If the ending address wasn't given, set it to the
  828.         BEQ.S    @4            ;end of memory.
  829.         MOVE.L    RealMemTop,D1        ;Use the "real" MemTop.
  830.         SUBQ.L    #1,D1
  831. @4        ST    (A0)+            ;Assume that nothing was found.
  832.         CLR.L    (A0)+            ;Clear the "found" address.
  833.         CLR.W    (A0)+            ;Make everything appear.
  834.         CLR.L    (A0)+            ;Prevent the value itself from being found.
  835.         MOVE.W    D3,(A0)+        ;Save the search size.
  836.         MOVE.L    D0,(A0)+        ;Save the beginning address.
  837.         MOVE.L    D1,(A0)            ;Save the ending address.
  838.         MOVE.L    D2,D6            ;Save the value that is being searched, but not in
  839.         SUBQ.W    #1,D3            ;memory, because it would be found there.
  840.         MOVE.W    D3,D4
  841.         ASL.W    #3,D4            ;Shift the high-order byte of the value into the
  842.         ROR.L    D4,D2            ;least significant byte of D2.
  843.         TST.B    -18(A0)
  844.         BMI.S    @5
  845.         BCLR    D5,D0            ;Align addresses to word boundaries for word-aligned
  846.         BSET    D5,D1            ;search.  D5 should be zero.
  847. @5        MOVE.L    D0,A1
  848.         SUB.L    D3,D1            ;Subtract the length from the ending address.
  849.         SUB.L    D0,D1            ;Get the length of the area to be searched.
  850.         BLT.S    @50            ;It is less than zero.
  851.         TST.B    -18(A0)
  852.         BPL.S    @30
  853.  
  854. @10        CMP.B    (A1)+,D2        ;Does this byte match?
  855. @11        DBEQ    D1,@10
  856.         BEQ.S    @12            ;YES.
  857.         SUB.L    val10000,D1        ;NO.  This is a high-order loop.
  858.         BCC.S    @10
  859. @50        MOVE.L    D6,-10(A0)
  860.         RTS                ;Pass back failure code.
  861.  
  862. @12        MOVE.W    D3,D4            ;Create private copies of the address, value, and
  863.         MOVE.L    D2,D5            ;length of value.
  864.         MOVE.L    A1,A3
  865.         BRA.S    @21
  866. @20        ROL.L    #8,D5            ;Compare the next byte in the value.
  867.         CMP.B    (A3)+,D5
  868.         BNE.S    @11
  869. @21        DBRA    D4,@20            ;Were all bytes present in the value compared?
  870.         CMP.L    A5,A1            ;YES.  Don't report a match if it is in the
  871.         BCS.S    @40            ;Monitor's variables area to prevent spurious finds.
  872.         CMP.L    A2,A1
  873.         BCS.S    @11
  874. @40        MOVEQ    #1,D0
  875.         BRA.S    @42            ;Go report a find.
  876.  
  877. @30        ROL.L    #8,D2            ;D1 contains the number of words, not bytes, for
  878.         LSR.L    #1,D1            ;word-aligned search.
  879. @31        CMP.W    (A1)+,D2
  880. @32        DBEQ    D1,@31
  881.         BEQ.S    @33
  882.         SUB.L    val10000,D1
  883.         BCC.S    @31
  884.         BRA.S    @50
  885. @33        CMP.W    #1,D3
  886.         BEQ.S    @34
  887.         MOVE.L    D2,D5
  888.         SWAP    D5
  889.         CMP.W    (A1),D5
  890.         BNE.S    @32
  891. @34        CMP.L    A5,A1            ;YES.  Don't report a match if it is in the
  892.         BCS.S    @41            ;Monitor's variables area to prevent spurious finds.
  893.         CMP.L    A2,A1
  894.         BCS.S    @32
  895. @41        MOVEQ    #2,D0
  896. @42        MOVE.L    A1,-(A0)        ;Save the address of the match plus one.
  897.         SUBQ.W    #2,A0
  898.         MOVE.L    D6,-(A0)        ;Save the value being searched.
  899.         SUBQ.W    #2,A0
  900.         SUB.W    D0,A1
  901.         MOVE.L    A1,-(A0)        ;Pass back the address of the match.
  902.         CLR.B    -(A0)            ;Indicate that the search was successful.
  903. StoreV        MOVE.L    A1,V.A5            ;Store this value in the V variable.
  904.         RTS
  905.  
  906.  
  907.     UAFunc    RegisterBuffer,Print
  908.         DC.B    'Registers {'
  909.         DC.B    If.Pos
  910.         DC.B      Skip+1,'PC=',PrHex+8,'} (0=save, 1=load, 2=swap)'
  911.         DC.B    If.Else
  912.         DC.B      '} (0=save)'
  913.     UAParam    RegisterBuffer,%00011
  914.         DC    $FF00
  915.         DCB.W    37,0            ;37 words for the registers
  916.     UACode    RegisterBuffer
  917.         TST.W    D7
  918.         BNE.S    BufferFunctions
  919.         ST    (A0)
  920.         RTS
  921. BufferFunctions    TST.B    (A0)            ;Are there stored registers?
  922.         BEQ.S    @10
  923.         TST.L    D0
  924.         BEQ.S    @10
  925.         RTS
  926. @10        CLR.W    (A0)+
  927.         LEA    PC.A5,A5        ;Get the PC.
  928.         MOVEQ    #37-1,D1        ;Use 37 words.
  929.         TST.L    D0            ;Get the function code.
  930.         BEQ.S    @1            ;SaveRegs.
  931.         SUBQ.L    #2,D0
  932.         BEQ.S    @2            ;SwapRegs.
  933.         BCC.S    @3            ;Exit if the number wasn't between 0 and 2.
  934.         EXG    A0,A5            ;LoadRegs. Do a reverse SaveRegs.
  935. @1        MOVE.W    (A5)+,(A0)+
  936.         DBRA    D1,@1
  937.         RTS
  938. @2        MOVE.W    (A5),D2            ;Exchange the register sets.
  939.         MOVE.W    (A0),(A5)+
  940.         MOVE.W    D2,(A0)+
  941.         DBRA    D1,@2
  942. @3        RTS
  943.  
  944.  
  945.         ;Pick one of three routines to follow this one.
  946.  
  947.     UAFunc    Print,Template
  948.         DC.B    'Print {'
  949.         DC.B    If.Pos
  950.         DC.B      If.Pos,'dump'
  951.         DC.B      If.Else,'disassembly'
  952.         DC.B      End.If
  953.         DC.B    If.Else
  954.         DC.B      If.Pos,'file'
  955.         DC.B      If.Else,'heap'
  956.         DC.B      End.If
  957.         DC.B    End.If
  958.         DC.B    '} {error=',PrHex+4,'} ('
  959.         DC.B    If.Pos,'bgn end'
  960.         DC.B    If.Else
  961.         DC.B      If.Pos,'file'
  962.         DC.B      If.Else,'zone'
  963.         DC.B      End.If
  964.         DC.B      '#'
  965.         DC.B    End.If
  966.         DC.B    ')'
  967.     UAParam    Print,%00101
  968.         DC    0
  969. PrintError    DC    0
  970.         DC    0
  971.     UACode    Print
  972.         TST.W    D7            ;Were any arguments supplied?
  973.         BNE.S    @2            ;YES.  Go to the printing section.
  974.         NOT.B    1(A0)            ;NO.  Go to the next state in the state machine.
  975.         BNE.S    @1
  976.         NOT.B    (A0)
  977.         EOR.B    #%00110,-2(A0)        ;Adjust the number of parameters allowed.
  978. @1        MOVE.W    (A0),4(A0)
  979.         RTS
  980. @2        MOVE.B    1(A0),D5        ;Prepare dump vs. disassembly or file vs. heap flag.
  981.         SUBQ.W    #2,D7            ;Is this a dump/disassembly print?
  982.         BCS.S    @3            ;NO.
  983.         MOVE.L    D0,A1            ;YES.
  984.         MOVE.L    D1,A4            ;Prepare the registers and go to the print routine.
  985.         JMP    _Print1
  986. @3        MOVE.W    D0,D6            ;Prepare the file number.
  987.         TST.B    D5
  988.         BEQ.S    @4
  989.         TST.L    D0            ;If the heap number is requested instead, prepare
  990.         SEQ    D6            ;that.
  991.         ASL.W    #8,D6
  992. @4        JMP    _Print2            ;Go to the print routine.
  993.  
  994.  
  995.     UAFunc    Template,StackLook
  996.         DC.B    'Template {'
  997.         DC.B    If.Pos
  998.         DC.B      If.Pos,'WindowRecord'
  999.         DC.B      If.Else,'ControlRecord'
  1000.         DC.B      End.If
  1001.         DC.B    If.Else
  1002.         DC.B      If.Pos,'TERec'
  1003.         DC.B      If.Else,'ParamBlock'
  1004.         DC.B      End.If
  1005.         DC.B    End.If
  1006.         DC.B    If.Pos
  1007.         DC.B      ' @'
  1008.         DC.B      PrHex+6
  1009.         DC.B    End.If
  1010.         DC.B    '} (addr)',Colon
  1011.         DC.B    If.Pos
  1012.         DC.B      PrHex+6
  1013.         DC.B    If.Else
  1014.         DC.B      If.Pos
  1015.         DC.B        'RA0'
  1016.     UAParam    Template,%00011
  1017.         DC    0
  1018.         LONG    -1
  1019. FutureTemplate    LONG    -1
  1020.     UACode    Template
  1021.         TST.B    D7
  1022.         BNE.S    ChoseTemplate
  1023.         TST.L    2(A0)
  1024.         BPL.S    CanceledTemplate
  1025.         NOT.B    1(A0)
  1026.         BNE.S    @1
  1027.         NOT.B    (A0)
  1028. @1        RTS
  1029.  
  1030. CanceledTemplate
  1031.         MOVE.W    #.StackLook-A,.Template-A(A2)
  1032.         MOVEQ    #-1,D0
  1033.         MOVE.L    D0,2(A0)
  1034.         MOVE.L    D0,6(A0)
  1035. Template.RTS    RTS
  1036.  
  1037. ChoseTemplate
  1038.         MOVE.L    A0,A5
  1039.         MOVE.L    D0,A0
  1040.         BSR    CheckA0            ;If A0 is odd or NIL then don't accept it.
  1041.         BCS.S    Template.RTS
  1042.  
  1043.         MOVE.W    #.Template1-A,.Template-A(A2)
  1044.         MOVE.W    (A5)+,D0        ;Get the signatures.
  1045.         MOVE.L    A0,(A5)            ;Put the address in the template indicator.
  1046.         MOVE.L    A0,A5            ;And into a handy register.
  1047.  
  1048.         LEA    Part1,A1        ;Point the registers to the templates.
  1049.         LEA    Part2,A2
  1050.         LEA    Part3,A3
  1051.         LEA    Part4,A4
  1052.  
  1053.         MOVE.W    D0,(A1)+        ;Inform each piece what kind it is.
  1054.         MOVE.W    D0,(A2)+
  1055.         MOVE.W    D0,(A3)+
  1056.         MOVE.W    D0,(A4)+
  1057.  
  1058.         PEA    FinishTemplate
  1059.  
  1060.         TST.W    D0
  1061.         BPL.S    @1
  1062.         TST.B    D0
  1063.         BMI    ParamTemplate
  1064.         BRA    TETemplate
  1065. @1        TST.B    D0
  1066.         BMI    ControlTemplate
  1067.  
  1068. WindowTemplate
  1069.         LEA    portBits(A5),A0
  1070.         MOVE.L    (A0)+,(A1)+    ;baseAddr
  1071.         MOVE.W    (A0)+,(A1)+    ;rowBytes
  1072.         MOVE.L    (A0)+,(A1)+    ;bounds
  1073.         MOVE.L    (A0)+,(A1)+
  1074.         MOVE.L    (A0)+,(A1)+    ;portRect
  1075.         MOVE.L    (A0)+,(A1)+
  1076.         MOVE.L    (A0)+,(A2)+    ;visRgn
  1077.         MOVE.L    (A0)+,(A2)+    ;clipRgn
  1078.         LEA    windowKind(A5),A0
  1079.         MOVE.W    (A0)+,(A2)+
  1080.         TST.B    (A0)+        ;visible
  1081.         SNE    (A2)+
  1082.         TST.B    (A0)+        ;hilited
  1083.         SNE    (A2)+
  1084.         TST.B    (A0)+        ;goAway
  1085.         SNE    (A2)+
  1086.         ADDQ    #1,A0        ;skip "spareFlag"
  1087.         MOVE.L    (A0)+,(A3)+    ;strucRgn
  1088.         MOVE.L    (A0)+,(A3)+    ;contRgn
  1089.         MOVE.L    (A0)+,(A3)+    ;updateRgn
  1090.         MOVE.L    (A0)+,(A3)+    ;defProc
  1091.         MOVE.L    (A0)+,(A3)+    ;dataHandle
  1092.         MOVE.L    wControlList(A5),(A4)+
  1093.         MOVE.L    nextWindow(A5),D2
  1094.         MOVE.L    D2,(A4)+
  1095.         MOVE.L    wRefCon(A5),(A4)+
  1096.  
  1097.         MOVE.L    wTitleHandle(A5),A0
  1098.         BSR    IndirectA0
  1099.         BCC.S    @1
  1100.         MOVEQ    #0,D0
  1101.         MOVE.L    D0,A0
  1102. @1        ST    (A4)+
  1103.         RTS
  1104.  
  1105. ControlTemplate
  1106.         MOVE.L    (A0)+,D2    ;nextControl
  1107.         MOVE.L    D2,(A1)+
  1108.         MOVE.L    (A0)+,(A1)+    ;owner
  1109.         MOVE.L    (A0)+,(A1)+    ;rect
  1110.         MOVE.L    (A0)+,(A1)+
  1111.         TST.B    (A0)+        ;visible
  1112.         SNE    (A1)+
  1113.         MOVE.B    (A0)+,(A1)+    ;hilited
  1114.         MOVE.W    (A0)+,(A2)+    ;value
  1115.         MOVE.L    (A0)+,(A2)+    ;min, max
  1116.         MOVE.L    (A0)+,(A2)+    ;defProc
  1117.         MOVE.L    (A0)+,(A2)+    ;dataHandle
  1118.         MOVE.L    (A0)+,(A2)+    ;actionProc
  1119.         MOVE.L    (A0)+,(A3)+    ;refCon
  1120.  
  1121.         ST    (A4)+
  1122.  
  1123.         AND.L    Lo3Bytes,D2
  1124.         BTST    #0,D2        ;Check for odd address.
  1125.         BNE.S    D2.NIL
  1126.         TST.L    D2
  1127.         BEQ.S    D2.NIL
  1128.         EXG    D2,A1
  1129.         MOVE.L    (A1),D2
  1130.         RTS
  1131.  
  1132. D2.NIL        MOVEQ    #0,D2
  1133.         RTS
  1134.  
  1135. TETemplate
  1136.         MOVE.L    (A0)+,(A1)+    ;destRect
  1137.         MOVE.L    (A0)+,(A1)+
  1138.         MOVE.L    (A0)+,(A1)+    ;viewRect
  1139.         MOVE.L    (A0)+,(A1)+
  1140.         MOVE.W    teLineHite(A5),(A1)+
  1141.         MOVE.W    teNLines(A5),(A1)+
  1142.         LEA    teSelPoint(A5),A0
  1143.         MOVE.L    (A0)+,(A2)+
  1144.         MOVE.L    (A0)+,(A2)+    ;selStart, selEnd
  1145.         ADDQ    #2,A0        ;skip "active"
  1146.         MOVE.L    (A0)+,(A2)+    ;wordBreak
  1147.         MOVE.L    (A0)+,(A2)+    ;clikLoop
  1148.         MOVE.L    (A0)+,(A3)+    ;clickTime
  1149.         MOVE.W    (A0)+,(A3)+    ;clickLoc
  1150.         MOVE.L    (A0)+,(A3)+    ;caretTime
  1151.         MOVE.W    (A0)+,(A3)+    ;caretState
  1152.  
  1153.         MOVE.W    (A0)+,D0    ;justification
  1154.         BEQ.S    @1        ;left?
  1155.         CMP.W    MinusOne,D0
  1156.         BEQ.S    @1        ;right?
  1157.         CMP.W    #1,D0
  1158.         BNE.S    @2        ;center?
  1159.         MOVE.W    #$FF,D0        ;center
  1160.         BRA.S    @1
  1161. @2        MOVE.W    #$FF00,D0    ;INVALID
  1162. @1        MOVE.W    D0,(A3)+
  1163.  
  1164.         MOVE.W    (A0)+,(A4)+    ;length
  1165.         MOVE.L    (A0)+,(A4)+    ;textH
  1166.         MOVE.W    teFont(A5),(A4)+
  1167.         LEA    teSize(A5),A0
  1168.         MOVE.W    (A0)+,(A4)+
  1169.         MOVE.L    (A0)+,(A4)+    ;port
  1170.         MOVE.L    (A0)+,(A4)+    ;hiHook
  1171.         MOVE.L    (A0)+,(A4)+    ;carHook
  1172.  
  1173.         MOVEQ    #-1,D2
  1174.         MOVE.L    D2,A0        ;A0 is for the name.
  1175.         MOVE.L    A5,D2        ;do the same one over again
  1176.         CLR.B    (A4)+
  1177.         RTS
  1178.  
  1179. ParamTemplate
  1180.         MOVE.L    (A0)+,(A1)+    ;qLink
  1181.         ADDQ    #2,A0        ;skip qType
  1182.         MOVE.W    (A0)+,(A1)+    ;trap
  1183.         MOVE.L    (A0)+,(A1)+    ;cmdAddr
  1184.         MOVE.L    (A0)+,(A1)+    ;completion
  1185.         MOVE.W    (A0)+,(A1)+    ;ioResult
  1186.         ADDQ    #4,A0        ;skip namePtr
  1187.         MOVE.L    (A0)+,(A2)+    ;vRefNum and refNum
  1188.         MOVE.W    (A0)+,(A2)+    ;version and permission
  1189.         MOVE.L    (A0)+,(A2)+    ;misc
  1190.         MOVE.L    (A0)+,(A2)+    ;buffer
  1191.         MOVE.L    (A0)+,(A3)+    ;reqCount
  1192.         MOVE.L    (A0)+,(A3)+    ;actCount
  1193.         MOVE.W    (A0)+,(A3)+    ;mode
  1194.         MOVE.L    (A0)+,(A3)+    ;offset
  1195.  
  1196.         MOVE.L    ioFileName(A5),A0
  1197.         MOVE.L    #$FF000000,D2
  1198.         ST    (A4)+
  1199.         RTS
  1200.  
  1201. FinishTemplate
  1202.         CLR.B    (A4)
  1203.         MOVE.L    A0,D7        ;Check for NIL
  1204.         BEQ.S    NameNIL        ;go mark it NIL.
  1205.         ST    (A4)        ;Mark valid, if so.
  1206.         MOVE.W    #63,D1        ;D1 is max allowable chars-1.
  1207.         LEA    Name64,A1
  1208.         MOVEQ    #0,D0
  1209.         MOVE.B    (A0)+,D0    ;Get string length into D0.
  1210. @1        SUBQ.W    #1,D0        ;Decrement length.
  1211.         BMI.S    @2        ;Don't stuff a char, stuff a NoOp.
  1212.         MOVE.B    (A0)+,(A1)+
  1213.         BRA.S    @3
  1214. @2        MOVE.B    #NoOp,(A1)+
  1215. @3        DBRA    D1,@1        ;Do it 64 times
  1216. NameNIL
  1217.         MOVE.L    D2,A0        ;Get the potential next address
  1218.         BSR    CheckA0
  1219.         BCC.S    @1
  1220.         MOVEQ    #-1,D0
  1221.         MOVE.L    D0,A0
  1222. @1        LEA    FutureTemplate,A1
  1223.         MOVE.L    A0,(A1)        ;Set up for next time
  1224.         RTS
  1225.  
  1226.     UAFunc    Template1,Template2
  1227.         DC.B    If.Pos
  1228.         DC.B      If.Pos
  1229.         DC.B        ':address=',Skip+1,PrHex+6
  1230.         DC.B        ':rowBytes=',Skip+1,PrHex+2
  1231.         DC.B        ':bounds=',PrHex+4,' ',PrHex+4,' ',PrHex+4,' ',PrHex+4
  1232.         DC.B        ':portRect=',PrHex+4,' ',PrHex+4,' ',PrHex+4,' ',PrHex+4
  1233.         DC.B      If.Else
  1234.         DC.B        ':nextControl=',Skip+1,PrHex+6
  1235.         DC.B        ':owner=',Skip+1,PrHex+6
  1236.         DC.B        ':rect=',PrHex+4,' ',PrHex+4,' ',PrHex+4,' ',PrHex+4
  1237.         DC.B        ':',If.Pos,'in',End.If,'visible'
  1238.         DC.B        ':hilite=',PrHex+2
  1239.         DC.B      End.If
  1240.         DC.B    If.Else
  1241.         DC.B      If.Pos
  1242.         DC.B        ':destRect=',PrHex+4,' ',PrHex+4,' ',PrHex+4,' ',PrHex+4
  1243.         DC.B        ':viewRect=',PrHex+4,' ',PrHex+4,' ',PrHex+4,' ',PrHex+4
  1244.         DC.B        ':height=',PrHex+4
  1245.         DC.B        ':lines=',PrHex+4
  1246.         DC.B      If.Else
  1247.         DC.B        ':qLink=',Skip+1,PrHex+6
  1248.         DC.B        ':trap=',PrHex+4
  1249.         DC.B        ':cmdAddr=',Skip+1,PrHex+6
  1250.         DC.B        ':completion=',Skip+1,PrHex+6
  1251.         DC.B        ':result=',PrHex+4
  1252.     UAParam    Template1,0
  1253. Part1        DC    0
  1254.         DCB.B    22,0
  1255.     UACode    Template1
  1256.  
  1257.  
  1258.     UAFunc    Template2,Template3
  1259.         DC.B    If.Pos
  1260.         DC.B      If.Pos
  1261.         DC.B        ':visRgn=',Skip+1,PrHex+6
  1262.         DC.B        ':clipRgn=',Skip+1,PrHex+6
  1263.         DC.B        ':windowKind=',PrHex+4
  1264.         DC.B        ':',If.Pos,'in',End.If,'visible'
  1265.         DC.B        ':',If.Pos,'not ',End.If,'hilited'
  1266.         DC.B        ':',If.Pos,'noG',If.Else,'g',End.If,'oAway'
  1267.         DC.B      If.Else
  1268.         DC.B        ':value=',PrHex+4
  1269.         DC.B        ':min=',PrHex+4
  1270.         DC.B        ':max=',PrHex+4
  1271.         DC.B        ':defProc=',Skip+1,PrHex+6
  1272.         DC.B        ':dataHandle=',Skip+1,PrHex+6
  1273.         DC.B        ':action=',Skip+1,PrHex+6
  1274.         DC.B      End.If
  1275.         DC.B    If.Else
  1276.         DC.B      If.Pos
  1277.         DC.B        ':selPoint=',PrHex+4,' ',PrHex+4
  1278.         DC.B        ':selStart=',PrHex+4
  1279.         DC.B        ':selEnd=',PrHex+4
  1280.         DC.B        ':wordBreak=',Skip+1,PrHex+6
  1281.         DC.B        ':clikLoop=',Skip+1,PrHex+6
  1282.         DC.B      If.Else
  1283.         DC.B        ':vRefNum=',PrHex+4
  1284.         DC.B        ':refNum=',PrHex+4
  1285.         DC.B        ':versNum=',PrHex+2
  1286.         DC.B        ':permission=',PrHex+2
  1287.         DC.B        ':misc=',Skip+1,PrHex+6
  1288.         DC.B        ':buffer=',Skip+1,PrHex+6
  1289.     UAParam    Template2,0
  1290. Part2        DC    0
  1291.         DCB.B    18,0
  1292.     UACode    Template2
  1293.  
  1294.  
  1295.     UAFunc    Template3,Template4
  1296.         DC.B    If.Pos
  1297.         DC.B      If.Pos
  1298.         DC.B        ':strucRgn=',Skip+1,PrHex+6
  1299.         DC.B        ':contRgn=',Skip+1,PrHex+6
  1300.         DC.B        ':updateRgn=',Skip+1,PrHex+6
  1301.         DC.B        ':defProc=',Skip+1,PrHex+6
  1302.         DC.B        ':dataHandle=',Skip+1,PrHex+6
  1303.         DC.B      If.Else
  1304.         DC.B        ':refCon=',PrHex+8
  1305.         DC.B      End.If
  1306.         DC.B    If.Else
  1307.         DC.B      If.Pos
  1308.         DC.B        ':clickTime=',PrHex+8
  1309.         DC.B        ':clickLoc=',PrHex+4
  1310.         DC.B        ':caretTime=',PrHex+8
  1311.         DC.B        ':caretState=',PrHex+4
  1312.         DC.B        ':',If.Pos
  1313.         DC.B          If.Pos,'left'
  1314.         DC.B          If.Else,'center'
  1315.         DC.B          End.If
  1316.         DC.B        If.Else
  1317.         DC.B          If.Pos,'???'
  1318.         DC.B          If.Else,'right'
  1319.         DC.B          End.If
  1320.         DC.B        End.If,' justify'
  1321.         DC.B      If.Else
  1322.         DC.B        ':reqCount=',PrHex+8
  1323.         DC.B        ':actCount=',PrHex+8
  1324.         DC.B        ':newLineChar=',PrHex+2
  1325.         DC.B        ':posMode=',PrHex+2
  1326.         DC.B        ':offset=',PrHex+8
  1327.     UAParam    Template3,0
  1328. Part3        DC    0
  1329.         DCB.B    20,0
  1330.     UACode    Template3
  1331.  
  1332.  
  1333.     UAFunc    Template4,ResetMacintosh
  1334.         DC.B    If.Pos
  1335.         DC.B      If.Pos
  1336.         DC.B        ':controlList=',Skip+1,PrHex+6
  1337.         DC.B        ':nextWindow=',Skip+1,PrHex+6
  1338.         DC.B        ':refCon=',PrHex+8
  1339.         DC.B        ':'
  1340.         DC.B      If.Else
  1341.         DC.B        ':Control '
  1342.         DC.B      End.If,'title'
  1343.         DC.B    If.Else
  1344.         DC.B      If.Pos
  1345.         DC.B        ':length=',PrHex+4
  1346.         DC.B        ':textH=',Skip+1,PrHex+6
  1347.         DC.B        ':font=',PrHex+3
  1348.         DC.B        ':size=',Skip+1,PrHex+2
  1349.         DC.B        ':port=',Skip+1,PrHex+6
  1350.         DC.B        ':hiHook=',Skip+1,PrHex+6
  1351.         DC.B        ':carHook=',Skip+1,PrHex+6
  1352.         DC.B      If.Else
  1353.         DC.B        ':Volume/File name'
  1354.         DC.B      End.If
  1355.         DC.B    End.If
  1356.         DC.B    If.Neg
  1357.         DC.B      '='
  1358.         DC.B      If.Neg
  1359.         DC.B        '"'
  1360. Name64        DCB.B        64,NoOp        ;name can be up to 64 chars
  1361.         DC.B        '"'
  1362.         DC.B      If.Else
  1363.         DC.B        'NIL'
  1364.     UAParam    Template4,0
  1365. Part4        DC    0
  1366.         DCB.B    22,0
  1367.         DC    0
  1368.     UACode    Template4
  1369.  
  1370.  
  1371.     UAFunc    StackLook,StackCrawl
  1372.         DC.B    'Stack addresses {'
  1373.         DC.B    If.Pos
  1374.         DC.B      PrHex+6
  1375.         DC.B      ' (',Recognize,Skip+1,')'    ; ? Recognize bug
  1376.         DC.B    If.Else
  1377.         DC.B      Skip+7
  1378.         DC.B    End.If
  1379.         DC.B    '} (addr)',Colon
  1380.         DC.B    If.Pos
  1381.         DC.B      PrHex+6
  1382.         DC.B    If.Else
  1383.         DC.B      If.Neg
  1384.         DC.B        'SP'
  1385.     UAParam    StackLook,%00011
  1386.         LONG    -1
  1387.         LONG    -1
  1388.         LONG    -1
  1389.     UACode    StackLook
  1390.         MOVE.L    A0,A4
  1391.         TST.B    D7            ;Check the number of parameters.
  1392.         BNE.S    Look
  1393. CancelLook
  1394.         MOVEQ    #-1,D0            ;If none, cancel things (RA6).
  1395.         MOVE.L    D0,(A4)+
  1396.         MOVE.L    D0,(A4)+
  1397.         MOVE.L    D0,(A4)+
  1398.         RTS
  1399. Look
  1400.         MOVE.L    D0,D1            ;Otherwise check validity.
  1401.         BSR.S    CheckStackD1.A0
  1402.         BCS.S    CancelLook        ;Invalid also means cancel.
  1403.         ADDQ.L    #2,D0            ;Advance D0.
  1404.         MOVE.L    (A0),D1
  1405.         BSR    CheckD1.A0
  1406.         BCS.S    Look            ;Keep looking for a valid value.
  1407.         CMP.L    ROMBase,A0
  1408.         BHS.S    StopLooking
  1409.         CMP.L    RealMemTop,A0
  1410.         BHS.S    Look            ;Keep looking for a valid value.
  1411. StopLooking
  1412.         MOVE.L    A0,V.A5            ;Put the contents in the monitor's V.
  1413.         MOVE.L    A0,(A4)
  1414.         MOVE.L    A0,4(A4)
  1415.  
  1416.         MOVE.L    D0,D1
  1417.         BSR    CheckStackD1.A0
  1418.         BCS.S    @3
  1419.  
  1420.         MOVE.L    A0,8(A4)        ;Next SP.
  1421.         RTS
  1422.  
  1423. @3        MOVE.W    #$FF00,8(A4)        ;No SP.
  1424.         RTS
  1425.  
  1426.  
  1427. CheckStackD1.A0
  1428.         BSR.S    CheckD1.A0
  1429.         BCS.S    @1
  1430.         MOVE.L    CurStackBase,D7        ;Get the stack base.
  1431.         NEG.L    D7
  1432.         ADD.L    A0,D7            ;Set the carry if D1>CurStackBase
  1433. @1        RTS
  1434.  
  1435.  
  1436. CheckD1.A0    ;A more thorough check based on CheckA0
  1437.  
  1438.         AND.L    Lo3Bytes,D1
  1439.         MOVE.L    D1,A0
  1440.         BSR    CheckA0
  1441.         BCS.S    @1
  1442.         ADD.L    #-$500000,D1        ;Set the carry if D1>500000
  1443. @1        RTS
  1444.  
  1445.  
  1446.     UAFunc    StackCrawl,GetResource
  1447.         DC.B    'Stack crawl {'
  1448.         DC.B    If.Pos
  1449.         DC.B      'PC=',PrHex+6
  1450.         DC.B      ' (',Recognize,Skip+1,')'    ; ? Recognize bug
  1451.         DC.B    If.Else
  1452.         DC.B      Skip+7
  1453.         DC.B    End.If
  1454.         DC.B    '} (addr)',Colon
  1455.         DC.B    If.Pos
  1456.         DC.B      PrHex+6
  1457.         DC.B    If.Else
  1458.         DC.B      If.Neg
  1459.         DC.B        'RA6'
  1460.     UAParam    StackCrawl,%00011
  1461.         LONG    -1
  1462.         LONG    -1
  1463.         LONG    -1
  1464.     UACode    StackCrawl
  1465.         MOVE.L    A0,A4
  1466.         TST.B    D7            ;Check the number of parameters
  1467.         BNE.S    Crawl
  1468. CancelCrawl
  1469.         MOVEQ    #-1,D0            ;If none, cancel things (RA6)
  1470.         MOVE.L    D0,(A4)+
  1471.         MOVE.L    D0,(A4)+
  1472.         MOVE.L    D0,(A4)+
  1473.         RTS
  1474. Crawl
  1475.         MOVE.L    D0,D1            ;Otherwise check validity
  1476.         BSR.S    CheckD1.A0
  1477.         BCS.S    CancelCrawl        ;Invalid also means cancel
  1478.         MOVE.L    A0,N.A5            ;Put the A6 in the monitor's N
  1479.         MOVE.L    4(A0),D1
  1480.         BSR    CheckD1.A0
  1481.         BCC.S    @1
  1482.         ST    (A4)            ;Invalid PC
  1483.         BRA.S    @2
  1484.  
  1485. @1        MOVE.L    A0,V.A5            ;Put the PC in the monitor's V
  1486.         MOVE.L    A0,(A4)
  1487.         MOVE.L    A0,4(A4)
  1488.  
  1489. @2        MOVE.L    D0,A0            ;De-ref that other thing.
  1490.         MOVE.L    (A0),D1
  1491.         BSR    CheckD1.A0
  1492.         BCS.S    @3
  1493.  
  1494.         MOVE.L    A0,8(A4)        ;Next A6
  1495.         RTS
  1496.  
  1497. @3        MOVE.W    #$FF00,8(A4)        ;No A6
  1498.         RTS
  1499.  
  1500.  
  1501.     UAFunc    GetResource,ShowScreen
  1502.         DC.B    'Load resource {'
  1503.         DC.B    If.Pos
  1504.         DC.B      'at ',PrHex+6
  1505.         DC.B    If.Else
  1506.         DC.B      Skip+3
  1507.         DC.B    End.If
  1508.         DC.B    '} (type ID)',Colon
  1509.         DC.B    If.Pos
  1510.         DC.B      Skip+1,'''',PrASCII+4,'''',' ',PrHex+4
  1511.     UAParam    GetResource,%00101
  1512.         LONG    -1
  1513.         DC    $FF00
  1514.         LONG    0
  1515.         DC    0
  1516.     UACode    GetResource
  1517.         TST.B    D7
  1518.         BNE.S    @1
  1519.         MOVEQ    #-1,D0
  1520.         MOVE.L    D0,(A0)+
  1521.         MOVE.B    D0,(A0)+
  1522.         RTS
  1523. @1        CLR.B    4(A0)
  1524.         BSR    ExiTMON.
  1525.         LEA    A0.A5,A1        ;Save Monitor's A0 through A2.
  1526.         MOVE.L    (A1),-(A2)
  1527.         MOVE.L    A5,(A1)            ;Store A5 in Monitor's A2.
  1528.         MOVE.L    -(A1),-(A2)
  1529.         MOVE.L    A0,(A1)            ;Store a pointer to GetResource's user data area in
  1530.         MOVE.L    -(A1),-(A2)        ;Monitor's A1.
  1531.         LEA    D0.A5,A1
  1532.         MOVE.L    (A1),-(A2)        ;Save Monitor's D0 through D2.
  1533.         MOVE.L    -(A1),-(A2)
  1534.         MOVE.L    D1,(A1)            ;Store D1 in Monitor's D1.
  1535.         MOVE.L    -(A1),-(A2)
  1536.         MOVE.L    D0,(A1)            ;Store D0 in Monitor's D0.
  1537.         LEA    LoadRes.,A0
  1538.         BRA    ExiTMON
  1539. LoadRes.
  1540.         MOVE.L    D0,6(A1)        ;Save the data given to this routine.
  1541.         MOVE.W    D1,10(A1)
  1542.         CLR.L    -(SP)            ;Prepare to call _GetResource.
  1543.         MOVE.L    D0,-(SP)
  1544.         MOVE.W    D1,-(SP)
  1545.         MOVE.W    ResErr,D2        ;Save the current resource manager error.
  1546.         _GetResource            ;Load the resource.
  1547.         MOVE.W    D2,ResErr
  1548.         ST    (A1)            ;Assume that an error occurred.
  1549.         MOVE.L    (SP)+,A0
  1550.         MOVE.L    A0,D0            ;If the handle is NIL, exit.
  1551.         BEQ.S    @1
  1552.         MOVE.L    (A0),D0            ;If it isn't NIL, give the dereferenced handle.
  1553.         MOVE.L    D0,(A1)
  1554.         CLR.B    (A1)
  1555.         MOVE.L    (A1),V.A2        ;Also store the position in V.
  1556. @1        MOVEM.L    (SP)+,D0/D1/D2/A0/A1/A2
  1557.         TRAPMon    'OK'
  1558.  
  1559.  
  1560.     UAFunc    ShowScreen,ResetMacintosh
  1561.         DC.B    'Click mouse outside TMON'
  1562.     UAParam    ShowScreen,%00001
  1563.     UACode    ShowScreen
  1564.         BSR.S    ExiTMON.        ;Prepare to exit the Monitor.
  1565.         LEA    ShowScreen.,A0
  1566.         BRA.S    ExiTMON
  1567. ShowScreen.
  1568.         TST.B    MBState            ;Wait until the mouse button is released.
  1569.         BPL.S    ShowScreen.
  1570. @1        TST.B    MBState            ;Wait until it is pressed again.
  1571.         BMI.S    @1
  1572.         TRAPMon    'OK'            ;Go back to the Monitor.
  1573.  
  1574.  
  1575. ExiTMON
  1576.         MOVE.L    A2,SP.A5
  1577.         MOVE.L    A0,-(A3)
  1578.         JMP    _ExiTMON
  1579.  
  1580. ExiTMON.
  1581.         MOVE.L    SP.A5,A2        ;Prepare the PC and SR to exit the Monitor.
  1582.         LEA    PC.A5,A3
  1583.         MOVE.L    (A3)+,-(A2)
  1584.         MOVE.W    (A3),-(A2)
  1585.         MOVE.W    #$2000,(A3)
  1586.         RTS
  1587.  
  1588.  
  1589.     UAFunc    ResetMacintosh,0
  1590.         DC.B    If.Pos
  1591.         DC.B      'Finder'
  1592.         DC.B    If.Else
  1593.         DC.B      'Shut down'
  1594.         DC.B    End.If
  1595.         DC.B    ' (confirm)'
  1596.     UAParam    ResetMacintosh,%00011
  1597.         DC.B    0
  1598.     UACode    ResetMacintosh
  1599.         TST.B    D7            ;If just a RETURN was pressed, toggle
  1600.         BNE.S    @1
  1601.         NOT.B    (A0)
  1602.         RTS
  1603. @1        TST.B    (A0)
  1604.         BPL.S    Finder
  1605.  
  1606.  
  1607. ShutDown
  1608.         SUB.W    #ioQElSize,SP        ;Eject disks in both drives and reset.
  1609.         MOVE.L    SP,A0
  1610.         CLR.L    ioVNPtr(A0)
  1611.         MOVE.L    VCBQHdr+qHead,A1    ;Get the first Drive Queue entry
  1612. @2        MOVE.L    A1,D0
  1613.         BEQ.S    @1
  1614.         MOVE.W    VCBVRefNum(A1),ioVRefNum(A0)
  1615.         _Eject                ;Eject a volume
  1616.         _UnmountVol
  1617.         MOVE.L    qLink(A1),A1        ;Advance along queue
  1618.         BRA.S    @2
  1619. @1        MOVE.L    ROMBase,A0        ;Get the restart address
  1620.         ADD    #10,A0            ;from the ROM.
  1621.         JMP    (A0)
  1622.  
  1623.  
  1624. Finder
  1625.         BSR    ExiTMON.        ;Prepare to exit the Monitor.
  1626.         LEA    Finder.,A0
  1627.         BRA    ExiTMON
  1628.  
  1629.  
  1630. Finder.
  1631.         MOVE.L    CurrentA5,A5        ;Set up globals
  1632.         MOVE.L    CurStackBase,SP
  1633.  
  1634. CloseResFiles
  1635.         MOVE.L    TopMapHndl,A0        ;Check if we are done yet
  1636.         CMP.L    SysMapHndl,A0
  1637.         BEQ.S    CloseOtherFiles
  1638.  
  1639.         MOVE.L    (A0),A0            ;Deref the map pointer
  1640.         MOVE.W    resFileID(A0),-(SP)    ;And get the file ID to close it
  1641.         _CloseResFile            ;Close resource files
  1642.         BRA.S    CloseResFiles
  1643.  
  1644. CloseOtherFiles
  1645.         MOVE.W    FSFCBLen,D3        ;Get the FCB length in D3
  1646.         BPL.S    NotMFS
  1647.         MOVE.W    #30,D3            ;MFS FCB length is 30
  1648. NotMFS
  1649.         SUB.W    #ioQElSize,SP        ;Close non-resource files
  1650.         MOVE.L    SP,A0
  1651.         MOVE.L    FCBSPtr,A1        ;Point to FCBs
  1652.         MOVE.W    (A1),D2            ;Get size of FCBs
  1653.         MOVEQ    #2,D1            ;Start with the first file
  1654. CheckFile
  1655.         CMP.W    D2,D1
  1656.         BHS.S    DidAllFiles
  1657.         CMP.W    SysMap,D1        ;Do NOT close the System resource file
  1658.         BEQ    NextFile
  1659.         TST.L    fcbFlNm(A1,D1.W)    ;Check if the file is used
  1660.         BEQ.S    NextFile
  1661.         MOVE.W    D1,ioRefNum(A0)        ;Close the file
  1662.         _Close
  1663. NextFile
  1664.         ADD.W    D3,D1            ;Advance to another FCB
  1665.         BRA.S    CheckFile
  1666.  
  1667. DidAllFiles
  1668.         _ExitToShell
  1669.  
  1670.  
  1671. ;The 2nd user area screen starts here (label, A000 trap and heap)
  1672.  
  1673.  
  1674.     UAFunc    LabelTableSet,LAddRemove
  1675.         DC.B    'Label table {'
  1676.         DC.B    If.Pos
  1677.         DC.B      Skip+1,PrHex+3,' labels} (nLabels [loc])',Colon
  1678.         DC.B      Skip+2,PrHex+3,' ',Skip+1,PrHex+6
  1679.         DC.B    If.Else
  1680.         DC.B      '} (nLabels [loc])'
  1681.     UAParam    LabelTableSet,%00111
  1682.         DC    $FF00
  1683. NumLabels    DC    0
  1684. LabelEnabled    DC    $FF00
  1685. LabelCapacity    DC    0
  1686. LabelTable    LONG    0
  1687.         DC    0
  1688.     UACode    LabelTableSet
  1689.         MOVE.L    D1,D2            ;Shift the parameters by one and fall into RecordTableSet.
  1690.         MOVE.L    D0,D1
  1691.         MOVEQ    #0,D0
  1692.         ADDQ.B    #1,D7
  1693.         BSR    RecordTableSet        ;Use the RecordTableSet routine to do most of the work.
  1694.         LEA    LabelEnabled,A0
  1695.         MOVE.W    (A0),-4(A0)
  1696.         RTS
  1697.  
  1698.  
  1699.     UAFunc    LAddRemove,LabelLoad
  1700.         DC.B    'Label add/remove {'
  1701.         DC.B    If.Pos
  1702.         DC.B      Skip+1,'"',PrASCII+8,'"',' '
  1703.         DC.B      If.Neg
  1704.         DC.B        'removed'
  1705.         DC.B      If.Else
  1706.         DC.B        'added '
  1707.         DC.B        If.Neg
  1708.         DC.B          'rel ''',PrASCII+4,''''
  1709.         DC.B        End.If
  1710.         DC.B      End.If
  1711.         DC.B    End.If
  1712.         DC.B    '} (lbl [adr [end]])'
  1713.     UAParam    LAddRemove,$80+%11101    ;$80 means the first 2 are a label
  1714.         DC    $FF00
  1715.         LONG    0
  1716.         LONG    0
  1717.         DC    0
  1718.         LONG    0
  1719.     UACode    LAddRemove
  1720.         AND.L    Lo3Bytes,D2        ;Clear the high bytes of the addresses.
  1721.         AND.L    Lo3Bytes,D3
  1722. LAddRemove.Map
  1723.         MOVE.L    D7,D6            ;If bit 31 of D7 is set, no checks are made.
  1724.         MOVE.L    A0,A3            ;Save A0.
  1725.         CLR.W    (A3)+            ;Initialize results.
  1726.         MOVE.L    D0,(A3)+
  1727.         MOVE.L    D1,(A3)+
  1728.         TST.W    D6            ;If no parameters, do nothing.
  1729.         BEQ.S    @10
  1730.         MOVE.B    LabelEnabled,D7        ;If there is no table of labels, do nothing.
  1731.         BMI.S    @10
  1732.         MOVE.B    _Inhibits,D7        ;Get the value of _Inhibits.
  1733.         SWAP    D7
  1734.         MOVE.L    D2,D4            ;Save D2 and D3.
  1735.         MOVE.L    D3,D5
  1736.         MOVEQ    #-1,D2
  1737.         BSR    LabelFind.        ;Is the label present in the table?
  1738.         TST.L    D0
  1739.         BNE.S    @2            ;NO.
  1740.         MOVE.L    A0,D0            ;YES.  Is it in the user area table?
  1741.         BEQ.S    @10            ;YES.
  1742.         SUBQ.W    #2,D6            ;NO.  Should it be removed?
  1743.         BNE.S    @3            ;NO.  Change its value.
  1744.         LEA    NumLabels,A1        ;YES.  Remove it.
  1745.         SUBQ.W    #1,(A1)
  1746.         MOVEQ    #0,D0            ;Call _BlockMove to shift the remaining labels
  1747.         MOVE.W    (A1),D0            ;forward.
  1748.         ASL.W    #4,D0
  1749.         MOVE.L    A0,A1
  1750.         ADD.W    #16,A0
  1751.         ADD.L    LabelTable,D0
  1752.         MOVE.L    D0,A2
  1753.         SUB.L    A1,D0
  1754.         BEQ.S    @1
  1755.         _BlockMove
  1756. @1        CLR.L    (A2)+            ;Clear the last label.
  1757.         CLR.L    (A2)+
  1758.         CLR.L    (A2)+
  1759.         CLR.L    (A2)+
  1760.         ST    (A3)            ;Tell the user that the label was removed.
  1761.         RTS
  1762. @10        ST    -10(A3)            ;Return an error.
  1763.         RTS
  1764. @2        SUBQ.W    #2,D6            ;If the label was not found, and no more parameters
  1765.         BEQ.S    @10            ;were given, return an error.
  1766.         LEA    NumLabels,A0        ;If can't insert another label because the table is
  1767.         MOVE.W    (A0),D2            ;full, return an error.
  1768.         CMP.W    LabelCapacity,D2
  1769.         BCC.S    @10
  1770.         ADDQ.W    #1,(A0)
  1771.         MOVE.L    LabelTable,A0
  1772.         ASL.W    #4,D2
  1773.         ADD.W    D2,A0
  1774. @3        MOVE.L    A0,-(SP)        ;Save the location to contain the next label.
  1775.         LEA    _Inhibits,A0
  1776.         MOVE.B    (A0),-(SP)        ;Set all _Inhibits flags except searching resources
  1777.         ORI.B    #%00110100,(A0)        ;and the master switch.
  1778.         SUB.W    #24,SP            ;Allocate space for _Recognize's information.
  1779.         MOVE.L    SP,A2
  1780.         ADDQ.W    #1,A2            ;Put the data on a word boundary for easier access.
  1781.         MOVEM.L    D4/A0,-(SP)
  1782.         MOVE.L    D4,D2
  1783.         MOVEQ    #-1,D0            ;If there is a third parameter, assume that
  1784.         SUBQ.W    #1,D6            ;_Recognize failed.
  1785.         BNE.S    @4
  1786.         JSR    _Recognize        ;Check if the address given in D4 was in a resource.
  1787. @4        MOVEM.L    (SP)+,D4/A0
  1788.         CLR.W    (A3)
  1789.         TST.B    D0
  1790.         BNE.S    @11            ;NO.
  1791.         ADDQ.W    #2,SP            ;YES.  Extract the resource type, ID, and internal
  1792.         MOVE.L    (SP)+,D4        ;offset.
  1793.         ST    1(A3)
  1794.         MOVE.L    D4,2(A3)
  1795.         BSR.S    @20
  1796.         MOVE.W    D0,D5
  1797.         SWAP    D5
  1798.         ADDQ.W    #6,SP
  1799.         BSR.S    @20
  1800.         SUB.W    #12,SP
  1801.         MOVE.W    D0,D5
  1802.         BRA.S    @13
  1803. @11        TST.L    D6            ;If bit 31 of D6 was set, do no checks.
  1804.         BMI.S    @13
  1805.         TST.W    D6            ;Calculate the ending address from the starting one
  1806.         BNE.S    @12            ;unless the ending address is already given.
  1807.         MOVE.L    D4,D5
  1808.         ADD.L    #$800,D5        ;Default is $800+starting address.
  1809. @12        CMP.L    D4,D5            ;Ending address must be greater than the starting
  1810.         BHI.S    @13            ;address.
  1811.         MOVE.L    D4,D5
  1812.         ADDQ.L    #1,D5
  1813. @13        ADD.W    #24,SP            ;Deallocate the stack space.
  1814.         MOVE.B    (SP)+,(A0)        ;Restore _Inhibits.
  1815.         MOVE.L    (SP)+,A0        ;Get the address into which the label is to be
  1816.         MOVE.L    D4,(A0)+        ;stored.
  1817.         MOVE.L    D5,(A0)+        ;Store the label data.
  1818.         MOVE.L    -8(A3),(A0)+
  1819.         MOVE.L    -(A3),(A0)+
  1820.         RTS
  1821.  
  1822. @20        MOVEQ    #3,D2            ;Extract a word from a four-digit hexadecimal
  1823.         LEA    4(SP),A1        ;number on the stack.
  1824. @21        MOVE.B    (A1)+,D1
  1825.         SUB.B    #'0',D1
  1826.         CMP.B    #10,D1
  1827.         BCS.S    @22
  1828.         SUBQ.B    #7,D1
  1829. @22        ASL.W    #4,D0            ;Store the result in D0.
  1830.         ADD.B    D1,D0
  1831.         DBRA    D2,@21
  1832. LabelLoadRTS    RTS
  1833.  
  1834.  
  1835.     UAFunc    LabelLoad,TrapRecord
  1836.         DC.B    'Label file load'
  1837.     UAParam    LabelLoad,%00001
  1838.     UACode    LabelLoad
  1839.         MOVE.B    LabelEnabled,D0        ;If there is no table of labels, do nothing.
  1840.         BMI.S    LabelLoadRTS
  1841.         BSR    ExiTMON.        ;Prepare to exit the Monitor.
  1842.         LEA    LabelLoad.,A0
  1843.         BRA    ExiTMON
  1844.  
  1845.  
  1846. ;
  1847. ;This subroutine is used to load label maps into memory.
  1848. ;
  1849. LabelLoad.
  1850.  
  1851. A6TypeList    EQU    -4
  1852. A6Reply        EQU    A6TypeList-64-rName
  1853. A6IO        EQU    A6Reply-ioQElSize
  1854. A6Size        EQU    A6IO
  1855.  
  1856. typeList    EQU    A6TypeList(A6)        ;Type list for _SFGetFile.
  1857. reply        EQU    A6Reply(A6)        ;Reply record from _SFGetFile.
  1858. param        EQU    A6IO(A6)        ;File I/O queue element.
  1859.  
  1860. sfGood        EQU    A6Reply+rGood(A6)
  1861. sfType        EQU    A6Reply+rType(A6)
  1862. sfVolume    EQU    A6Reply+rVolume(A6)
  1863. sfVersion    EQU    A6Reply+rVersion(A6)
  1864. sfName        EQU    A6Reply+rName(A6)
  1865.  
  1866. scratch64    EQU    reply            ;At least 64 bytes will be here.
  1867.  
  1868.         MOVEM.L    D0-D7/A0-A5,-(SP)    ;Save registers.
  1869.         MOVE.L    CurrentA5,A5        ;Get A5 for QuickDraw.
  1870.         LINK    A6,#A6Size
  1871.         MOVE.L    #'TEXT',typeList
  1872.         MOVE.L    #$00440052,-(SP)    ;where = (82,68).
  1873.         CLR.L    -(SP)            ;Prompt parameter - not used.
  1874.         CLR.L    -(SP)            ;No fileFilter.
  1875.         MOVE.W    #1,-(SP)        ;One type.
  1876.         PEA    typeList        ;Type list.
  1877.         CLR.L    -(SP)            ;No dlgHook.
  1878.         PEA    reply            ;reply record.
  1879.         _SFGetFile
  1880.         LEA    A5.TMON,A5        ;Get the Monitor's A5.
  1881.         TST.B    sfGood            ;Was cancel pressed?
  1882.         BEQ.S    @20            ;YES.  Do nothing.
  1883.         LEA    param,A0
  1884.         LEA    sfName,A1        ;Prepare the parameter block for _Open.
  1885.         MOVE.L    A1,ioFileName(A0)
  1886.         MOVE.W    sfVolume,ioVRefNum(A0)
  1887.         MOVE.W    #1,ioFileType(A0)    ;Clear ioFileType and set ioPermssn to read.
  1888.         CLR.L    ioOwnBuf(A0)        ;No special file buffer.
  1889.         _Open                ;Open the text file.
  1890.         BNE.S    @20            ;If errors, do nothing.
  1891.         MOVEQ    #0,D6            ;Get the next identifier.
  1892.         BRA.S    @2
  1893. @1        ADDQ.W    #8,SP
  1894. @2        MOVE.L    #'    ',-(SP)        ;Initially clear all eight characters to spaces.
  1895.         MOVE.L    (SP),-(SP)
  1896.         MOVEQ    #0,D3
  1897. @3        BSR    @40            ;Get the next character.
  1898.         BEQ.S    @1            ;If this is not a normal legal ASCII character,
  1899.         CMP.B    #'=',D0            ;restart.
  1900.         BEQ.S    @4            ;If this is the equal sign, proceed.
  1901.         CMP.B    #8,D3            ;Put this character onto the string, but keep only
  1902.         BCC.S    @3            ;the first eight characters found.
  1903.         MOVE.B    D0,0(SP,D3.W)
  1904.         ADDQ.W    #1,D3
  1905.         BRA.S    @3
  1906.  
  1907. @20        UNLK    A6
  1908.         MOVEM.L    (SP)+,D0-D7/A0-A5    ;Exit with an error.
  1909.         TRAPMon    'Bad load'
  1910.  
  1911. @4        TST.W    D3            ;If the identifier was null, try again.
  1912.         BEQ.S    @1
  1913.         MOVEM.L    (SP)+,D2/D3
  1914.         BSR.S    @60            ;Get a decimal number (the segment number).
  1915.         BCS.S    @2            ;If error, try again.
  1916.         CMP.B    #':',D0            ;The next character must be a colon.
  1917.         BNE.S    @2
  1918.         MOVE.W    D1,D4            ;Save the segment number in D4.
  1919.         BSR.S    @30            ;Get the offset.
  1920.         BCS.S    @2
  1921.         AND.L    Lo3Bytes,D1        ;Clear the high byte of the address.
  1922.         MOVEM.L    D5-D7/A2-A4/A6,-(SP)    ;Save registers for LAddRemove.
  1923.         MOVE.L    D2,D0
  1924.         EXG    D1,D3
  1925.         TST.W    D4            ;If the segment number was zero, create an absolute
  1926.         BNE.S    @10            ;reference.
  1927.         MOVE.L    D3,D2
  1928.         ADD.L    #$800,D3        ;Let the ending address equal the starting address
  1929.         BRA.S    @11            ;plus $800.
  1930. @10        MOVE.L    #'CODE',D2        ;If the segment number was not zero, create a
  1931.         SWAP    D3            ;'CODE' resource-relative reference.
  1932.         MOVE.W    D4,D3
  1933.         SWAP    D3
  1934.         ADDQ.W    #4,D3            ;Skip the four bytes at the segment beginning.
  1935. @11        MOVEQ    #9,D7            ;Set bit 31 of D7.
  1936.         ROR.L    #1,D7
  1937.         LEA    scratch64,A3        ;Provide a scratch area for LAddRemove.
  1938.         BSR    LAddRemove.Map        ;Add the label.  There is no error checking.
  1939.         MOVEM.L    (SP)+,D5-D7/A2-A4/A6
  1940.         BRA    @2
  1941.  
  1942. @30        MOVEQ    #0,D5            ;Attempt to get a hexadecimal number.  D5 is zero
  1943.         MOVEQ    #0,D1            ;when there are no digits.  D1 has the number.
  1944. @31        BSR.S    @40            ;Get the next character and make it into a number.
  1945.         MOVE.B    D0,D7            ;D7 is destroyed.
  1946.         SUB.B    #'0',D7
  1947.         BCS.S    @32
  1948.         CMP.B    #10,D7
  1949.         BCS.S    @33
  1950.         CMP.B    #17,D7
  1951.         BCS.S    @32
  1952.         SUBQ.B    #7,D7
  1953.         CMP.B    #$10,D7
  1954.         BCC.S    @32
  1955. @33        LSL.L    #4,D1            ;If successful, append it to the number.  There is
  1956.         ADD.B    D7,D1            ;no overflow checking.
  1957.         MOVEQ    #1,D5
  1958.         BRA.S    @31
  1959. @32        SUBQ.B    #1,D5            ;Set the carry if no digits were found.
  1960.         RTS
  1961.  
  1962. @60        MOVEQ    #0,D5            ;Attempt to get a decimal number.  D5 is zero
  1963.         MOVEQ    #0,D1            ;when there are no digits.  D1 has the number.
  1964. @61        BSR.S    @40            ;Get the next character and make it into a number.
  1965.         MOVE.B    D0,D7            ;D7 is destroyed.
  1966.         SUB.B    #'0',D7
  1967.         BCS.S    @62
  1968.         CMP.B    #10,D7
  1969.         BCC.S    @62
  1970. @63        MOVEQ    #0,D0            ;Make a number in D0.
  1971.         MOVE.B    D7,D0
  1972.         LSL.L    #1,D1            ;If successful, append it to the number.  There is
  1973.         ADD.L    D1,D0            ;no overflow checking.
  1974.         LSL.L    #2,D1
  1975.         ADD.L    D0,D1
  1976.         MOVEQ    #1,D5
  1977.         BRA.S    @61
  1978. @62        SUBQ.B    #1,D5            ;Set the carry if no digits were found.
  1979.         RTS
  1980.  
  1981. @40        TST.B    D6            ;If the end of file was encountered, go exit now.
  1982.         BNE.S    @50
  1983.         LEA    param,A0
  1984.         LEA    -1(A6),A1
  1985.         MOVE.L    A1,ioBuffer(A0)
  1986.         MOVEQ    #1,D0
  1987.         MOVE.L    D0,ioReqCount(A0)    ;Request a read of one byte.
  1988.         CLR.W    ioPosMode(A0)        ;Read from the mark.
  1989.         _Read
  1990.         BMI.S    @41            ;If error, pass back a zero and exit on the next
  1991.         MOVE.B    -1(A6),D0        ;call to @40 (to finish a number if necessary).
  1992.         CMP.B    #' ',D0
  1993.         BEQ.S    @40            ;Ignore spaces.
  1994.         BCS.S    @42
  1995.         CMP.B    #$7F,D0            ;Convert characters below $20 and above $7E to 0.
  1996.         BCS.S    @43
  1997.         BRA.S    @42
  1998. @41        MOVEQ    #1,D6            ;Set the end of file flag.
  1999. @42        MOVEQ    #0,D0
  2000. @43        TST.B    D0
  2001.         RTS
  2002.  
  2003. @50        _Close                ;Close the file.
  2004.         UNLK    A6
  2005.         MOVEM.L    (SP)+,D0-D7/A0-A5    ;Exit with no error.
  2006.  
  2007.         TRAPMon    'OK'
  2008.  
  2009.  
  2010.     UAFunc    TrapRecord,RecordTableSet
  2011.         DC.B    'Trap record (t0 [t1 [PC0 PC1]])',Colon
  2012.         DC.B    If.Pos
  2013.         DC.B      Skip+1,DisAsm0,' ',DisAsm0
  2014.         DC.B      If.Pos
  2015.         DC.B        '  ',PrHex+6,' ',Skip+1,PrHex+6
  2016.     UAParam    TrapRecord,%10111
  2017. TrapRList    DC    $FF00
  2018.         DC    0,0
  2019.         LONG    -1
  2020.         LONG    -1
  2021.         ADDR    RecordHook
  2022.     UACode    TrapRecord
  2023.         BRA    A000
  2024.  
  2025.  
  2026.     UAFunc    RecordTableSet,TrapScramble
  2027.         DC.B    'Record {'
  2028.         DC.B    If.Neg
  2029.         DC.B      Skip+1,PrHex+4,' new traps'
  2030.         DC.B    If.Else
  2031.         DC.B      Skip+3
  2032.         DC.B    End.If
  2033.         DC.B    '} (fullStop nMsg [loc])',Colon
  2034.         DC.B    If.Pos
  2035.         DC.B      PrHex+1,' ',PrHex+3,' ',Skip+1,PrHex+6
  2036.     UAParam    RecordTableSet,%01101
  2037.         DC    0
  2038. RecordData    DC    0
  2039.         DC    $FF00
  2040.         DC    0
  2041.         LONG    0
  2042.         DC    0
  2043.         DC    0
  2044.     UACode    RecordTableSet
  2045.         ADDQ    #2,A0
  2046.         MOVE.L    A0,A2
  2047.         CLR.W    (A2)+            ;Always set the number of new traps to zero.
  2048.         TST.B    8(A2)            ;If a block was previously allocated, deallocate it
  2049.         BEQ.S    @1            ;now.
  2050.         MOVE.L    4(A2),A0
  2051.         MOVE.L    D0,-(SP)
  2052.         _DisposPtr
  2053.         MOVE.L    (SP)+,D0
  2054.         CLR.B    8(A2)            ;Don't deallocate it again.
  2055. @1        MOVE.L    A2,A1
  2056.         CMP.B    #2,D7            ;If not enough parameters present, exit.
  2057.         BCS.S    @10
  2058.         AND.W    #$7FF,D1        ;Can't have a zero-message storage area.
  2059.         BEQ.S    @10
  2060.         CLR.B    (A1)+            ;Set the recording master switch.
  2061.         TST.L    D0
  2062.         SNE    (A1)            ;Initialize the overflow flag.
  2063.         NEG.B    (A1)+
  2064.         MOVE.W    D1,(A1)+        ;If data given, store it.
  2065.         MOVEQ    #0,D0
  2066.         MOVE.W    D1,D0
  2067.         ASL.W    #4,D0
  2068.         SUBQ.W    #3,D7            ;If address given, done.
  2069.         BEQ.S    @6            ;Otherwise, allocate a block of the appropriate size
  2070.         _NewPtr,Sys+Clear        ;in the system Heap.
  2071.         BNE.S    @10            ;If error, turn off the master switch.
  2072.         ST    4(A1)            ;Set the heap block allocated flag.
  2073. @9        MOVE.L    A0,(A1)            ;Store the address of the block.
  2074.         MOVE.L    A0,V.A5            ;Store it also in the V variable.
  2075.         RTS
  2076. @6        MOVE.L    D2,A0
  2077.         MOVE.L    A0,A3            ;Clear the block if it was manually allocated.
  2078.         LSR.W    #2,D0
  2079.         BRA.S    @8
  2080. @7        CLR.L    (A3)+
  2081. @8        DBRA    D0,@7
  2082.         BRA.S    @9
  2083.  
  2084. @10        ST    (A2)            ;Clear the master switch.
  2085.         RTS
  2086.  
  2087.  
  2088. RecordEnter
  2089.         LEA    RecordData+2,A0        ;Prepare to use the swapping routine to move the
  2090.         MOVE.W    (A0)+,D0        ;latest traps to the beginning.
  2091.         BMI.S    @1
  2092.         MOVEQ    #0,D1            ;Otherwise use SlowScramble to shift the message table
  2093.         MOVE.W    (A0)+,D1        ;so that the latest message is at the top.
  2094.         ASL.W    #4,D1            ;D1 now contains the size of the table.
  2095.         MOVE.L    (A0)+,A5        ;A5 contains its beginning.
  2096.         MOVEQ    #0,D4
  2097.         MOVE.W    2(A0),D4        ;D4 contains the offset to the current storing
  2098.         BEQ.S    @1            ;position in the table.
  2099.         ASL.W    #4,D4
  2100.         SUB.L    D4,D1            ;D1 now contains the offset from D4 to the end.
  2101.         MOVE.L    A5,A4
  2102.         ADD.L    D4,A4            ;A4 now points to the current storing position.
  2103.         BSR    SlowScramble        ;Use the routine from ScrambleHeap to expedite shifting.
  2104. @1
  2105.         LEA    RecordData,A0        ;Check if there were any?
  2106.         TST.W    (A0)
  2107.         SNE    -2(A0)
  2108.         RTS
  2109.  
  2110. RecordExit
  2111.         LEA    RecordData,A0        ;Clear the number of messages every time exiting
  2112.         CLR.W    (A0)            ;the Monitor.
  2113.         CLR.W    12(A0)
  2114.         RTS
  2115.  
  2116.  
  2117.     UAFunc    TrapScramble,HeapInfo
  2118.         DC.B    'Trap {heap check'
  2119.         DC.B    If.Neg
  2120.         DC.B      ', scramble'
  2121.         DC.B    End.If
  2122.         DC.B    If.Neg
  2123.         DC.B      ', purge'
  2124.         DC.B    End.If
  2125.         DC.B    '} (zone#)',Colon
  2126.         DC.B    If.Pos,PrHex+1
  2127.     UAParam    TrapScramble,%00011
  2128. CheckOnly    DC.B    $FF
  2129. PurgeAlso    DC.B    0
  2130. TrapSList    DC.B    $80
  2131. CurrentHeap    DC.B    0
  2132.         DC    $1E,$27            ;_NewPtr _ReallocHandle
  2133.         LONG    -1
  2134.         LONG    -1
  2135.         ADDR    ScrambleHook
  2136.     UACode    TrapScramble
  2137.         TST.B    D7            ;If no number was given, go to the second part.
  2138.         BEQ.S    @2
  2139.         TST.L    D0            ;Choose the heap and enable the scramble.
  2140.         BEQ.S    @1
  2141.         MOVEQ    #1,D0
  2142. @1        MOVE.W    #.ScrambleNow-A,.TrapScramble-A(A2)
  2143.         CLR.B    ScrambleNowErr-A(A2)
  2144.         ST    HeapInfoDisp-A(A2)
  2145.         CLR.B    HeapInfoHeap-A(A2)
  2146.         MOVE.W    D0,2(A0)
  2147.         BRA.S    @3
  2148. @2        MOVE.W    #.HeapInfo-A,.TrapScramble-A(A2)
  2149.         BSET    #7,2(A0)        ;If the ScrambleHeap is enabled, disable it.
  2150.         BEQ.S    @3            ;Otherwise,
  2151.         NOT.B    1(A0)            ;allow the user to pick a combination of two flags.
  2152.         BMI.S    @3
  2153.         NOT.B    (A0)            ;Flip the heap flag.
  2154. @3        MOVE.W    (A0),CheckOnly.-A(A2)    ;Notify the ScrambleNow function.
  2155.         BRA    A000OnOff        ;Check the master A000 intercept switch.
  2156.  
  2157.  
  2158.     UAFunc    HeapInfo,TrapDiscipline
  2159.         DC.B    'Heap {'
  2160.         DC.B    If.Pos
  2161.         DC.B      'free=',PrHex+6
  2162.         DC.B      Skip+1,' max=',PrHex+6
  2163.         DC.B      Skip+1,' grow=',PrHex+6
  2164.         DC.B    If.Else
  2165.         DC.B      Skip+3,Skip+4,Skip+4
  2166.         DC.B    End.If
  2167.         DC.B    '} (zone#)',Colon
  2168.         DC.B    If.Neg
  2169.         DC.B      PrHex+1
  2170.     UAParam    HeapInfo,%00011
  2171. HeapInfoDisp    LONG    -1
  2172.         LONG    -1
  2173.         LONG    -1
  2174. HeapInfoHeap    DC    0
  2175.     UACode    HeapInfo
  2176.         TST.B    D7
  2177.         BNE.S    @10
  2178.         ST    (A0)
  2179.         CLR.B    12(A0)
  2180.         RTS
  2181. @10        MOVE.L    A0,A4            ;Save a pointer to the variables.
  2182.         ADD.W    #12,A0
  2183.         ST    (A0)+
  2184.         TST.L    D0
  2185.         SNE    (A0)            ;Store the given heap zone.
  2186.         NEG.B    (A0)
  2187.         BSR    GetZone            ;Get the appriopriate heap zone.
  2188.         BSR    PurgeHeap        ;Get the maximum possible block size.
  2189.         MOVE.L    12(A6),(A4)+        ;Get the theoretical number of free bytes.
  2190.         MOVE.L    D0,(A4)+        ;Get the maximum allowable block size.
  2191.         MOVE.L    A0,D0
  2192.         BEQ.S    @2            ;If this isn't the application heap zone, exit.
  2193.         MOVE.L    SP.A5,D0        ;Get the SP.
  2194.         AND.L    Lo3Bytes,D0
  2195.         SUB.L    MinStack,D0        ;Pick either the application limit or SP-minimum
  2196.         CMP.L    ApplLimit,D0        ;stack size, whichever is less.
  2197.         BCS.S    @1
  2198.         MOVE.L    ApplLimit,D0
  2199. @1        SUB.L    HeapEnd,D0        ;Subtract the end of heap from that.
  2200. @2        MOVE.L    D0,(A4)+        ;Get the maximum grow area.
  2201.         RTS
  2202.  
  2203.  
  2204.     UAFunc    ScrambleNow,TrapDiscipline
  2205.         DC.B    'Check'
  2206.         DC.B    If.Neg
  2207.         DC.B      ', scramble'
  2208.         DC.B    End.If
  2209.         DC.B    If.Neg
  2210.         DC.B      ', purge'
  2211.         DC.B    End.If
  2212.         DC.B    ' now {'
  2213.         DC.B    If.Neg
  2214.         DC.B      'heap error'
  2215.         DC.B    End.If
  2216.         DC.B    '}'
  2217.     UAParam    ScrambleNow,%00001
  2218. CheckOnly.    DC.B    $FF
  2219. PurgeAlso.    DC.B    $00
  2220. ScrambleNowErr    DC.B    0            ;Was there an error?
  2221.     UACode    ScrambleNow
  2222.         BSR    ScrambleHeap
  2223.         LEA    ScrambleNowErr,A0
  2224.         TST.L    D0
  2225.         SNE    (A0)            ;Set if there is an error.
  2226.         RTS
  2227.  
  2228.  
  2229.     UAFunc    TrapDiscipline,TrapChecksum
  2230.         DC.B    'Trap discipline (t0 [t1 [PC0 PC1]])',Colon
  2231.         DC.B    If.Pos
  2232.         DC.B      Skip+1,DisAsm0,' ',DisAsm0
  2233.         DC.B      If.Pos
  2234.         DC.B        '  ',PrHex+6,' ',Skip+1,PrHex+6
  2235.     UAParam    TrapDiscipline,%10111
  2236. TrapDList    DC    $FF00
  2237.         DC    0,0
  2238.         LONG    -1
  2239.         LONG    -1
  2240.         ADDR    DisciplineHook
  2241.     UACode    TrapDiscipline
  2242.         BRA    A000
  2243.  
  2244.  
  2245.     UAFunc    TrapChecksum,Checksum
  2246.         DC.B    'Trap checksum (t0 [t1 [PC0 PC1]])',Colon
  2247.         DC.B    If.Pos
  2248.         DC.B      Skip+1,DisAsm0,' ',DisAsm0
  2249.         DC.B      If.Pos
  2250.         DC.B        '  ',PrHex+6,' ',Skip+1,PrHex+6
  2251.     UAParam    TrapChecksum,%10111
  2252. TrapCList    DC    $FF00
  2253.         DC    0,0
  2254.         LONG    -1
  2255.         LONG    -1
  2256.         ADDR    ChecksumHook
  2257.     UACode    TrapChecksum
  2258.         BRA    A000
  2259.  
  2260.  
  2261.     UAFunc    Checksum,TrapIntercept
  2262.         DC.B    'Checksum (bgn end) {',PrHex+4,'}',Colon
  2263.         DC.B    Skip+1,PrHex+6,' ',Skip+1,PrHex+6
  2264.     UAParam    Checksum,%00100
  2265. ChecksumValue    DC    0
  2266.         LONG    $400000
  2267.         LONG    $40FFFF
  2268.     UACode    Checksum
  2269.         AND.L    Lo3Bytes,D0
  2270.         AND.L    Lo3Bytes,D1
  2271.         MOVEM.L    D0/D1,2(A0)        ;Save the addresses.
  2272.         BSR.S    Checker            ;Calculate the checksum.
  2273.         MOVE.W    D2,(A0)            ;Store the checksum.
  2274.         RTS
  2275.  
  2276. Checker
  2277.         SUB.L    D0,D1            ;End must not be less than start.
  2278.         BLT.S    @2
  2279.         MOVE.L    D0,A1
  2280. @1        ADD.B    (A1)+,D2        ;Add another byte and shift.
  2281.         ROR.W    #1,D2
  2282.         DBRA    D1,@1
  2283.         SUB.L    val10000,D1        ;This is the outer checksum loop.
  2284.         BCC.S    @1
  2285. @2        RTS
  2286.  
  2287. ChecksumInit
  2288.         LEA    ChecksumValue,A0
  2289.         MOVEM.L    2(A0),D0/D1
  2290.         BSR.S    Checker
  2291.         MOVE.W    D2,(A0)
  2292.         RTS
  2293.  
  2294.  
  2295.     UAFunc    TrapIntercept,TrapSignal
  2296.         DC.B    'Trap intercept (t0 [t1 [PC0 PC1]])',Colon
  2297.         DC.B    If.Pos
  2298.         DC.B      Skip+1,DisAsm0,' ',DisAsm0
  2299.         DC.B      If.Pos
  2300.         DC.B        '  ',PrHex+6,' ',Skip+1,PrHex+6
  2301.     UAParam    TrapIntercept,%10111
  2302. TrapIList    DC    $FF00
  2303.         DC    0,0
  2304.         LONG    -1
  2305.         LONG    -1
  2306.         ADDR    InterceptHook
  2307.     UACode    TrapIntercept
  2308.         BRA    A000
  2309.  
  2310.  
  2311.     UAFunc    TrapSignal,0
  2312.         DC.B    'Trap signal (t0 [t1 [PC0 PC1]])',Colon
  2313.         DC.B    If.Pos
  2314.         DC.B      Skip+1,DisAsm0,' ',DisAsm0
  2315.         DC.B      If.Pos
  2316.         DC.B        '  ',PrHex+6,' ',Skip+1,PrHex+6
  2317.     UAParam    TrapSignal,%10111
  2318. TrapGList    DC    0
  2319.         DC    $170,$171        ;_GetNextEvent,_EventAvail
  2320.         LONG    -1
  2321.         LONG    -1
  2322.         ADDR    SignalHook
  2323.     UACode    TrapSignal
  2324.         BRA    A000
  2325.  
  2326.  
  2327.         ;####################################
  2328.         ;##                                ##
  2329.         ;##  A000 hook controller section  ##
  2330.         ;##                                ##
  2331.         ;####################################
  2332.  
  2333. ;
  2334. ;This routine is an "A000 hook controller" of the user area.  It examines the parameter lists TrapDList,
  2335. ;TrapSList, TrapCList, TrapIList, TrapRList, and TrapGList and checks if they contain routines that
  2336. ;should be executed.  If so, the routine is called (the routine's address is contained in the last
  2337. ;word of its parameter list).  If the routine does not detect any errors, it should return 0 in
  2338. ;D0.W; otherwise, it should return an offset into the user area, which will be called to display the
  2339. ;error message while returning to the Monitor.
  2340. ;
  2341. ;The routines called must preserve all registers except D0, D1, A0, and A1.  They may use A000 traps
  2342. ;without fear of reentrancy problems, as the Monitor's A000 hook is disabled for the duration of
  2343. ;their execution.  The interrupt button is also disabled, and the interrupt level is set to 7.
  2344. ;
  2345. ;Upon entry D0.W contains the trap word stripped to the 9 least significant bits and A0 contains
  2346. ;the address of the trap word.
  2347. ;
  2348. ;Beware:  Any 68000 exceptions like address errors or illegal instructions will have the same
  2349. ;effect as pressing command-interrupt because the Monitor will think that the error occurred in
  2350. ;its code.
  2351. ;
  2352.  
  2353. A000Hook    MOVEM.L    D0/D1/A0/A1,-(SP)    ;Save 4 registers.
  2354.         MOVE.L    10+4*4(SP),D0        ;Get the A000 trap address.
  2355.         AND.L    Lo3Bytes,D0        ;Clear the high PC byte.
  2356.         MOVE.L    D0,A0
  2357.         MOVE.W    (A0),D0
  2358.         AND.W    #$09FF,D0        ;Get the trap number into D0.
  2359.         BCLR    #11,D0
  2360.         BNE.S    @1
  2361.         AND.W    #$00FF,D0        ;Clear the eighth bit for OS traps.
  2362.  
  2363. @1        LEA    TrapRList,A1        ;Check the five routines that have A000 hooks if
  2364.         BSR.S    @10            ;they want to be executed.
  2365.         LEA    TrapSList,A1
  2366.         BSR.S    @10
  2367.         LEA    TrapDList,A1
  2368.         BSR.S    @10
  2369.         LEA    TrapCList,A1
  2370.         BSR.S    @10
  2371.         LEA    TrapIList,A1
  2372.         BSR.S    @10
  2373.         LEA    TrapGList,A1
  2374.         BSR.S    @10
  2375.         MOVEM.L    (SP)+,D0/D1/A0/A1    ;If everything is fine, exit.
  2376. @2        RTS
  2377.  
  2378. @10        TST.W    (A1)+
  2379.         BMI.S    @2
  2380.         CMP.W    (A1)+,D0        ;Is it in the specified range?
  2381.         BCS.S    @2
  2382.         CMP.W    (A1)+,D0
  2383.         BHI.S    @2
  2384.         TST.B    (A1)            ;YES.  Was a PC range specified?
  2385.         BMI.S    @11            ;If not, do the function.
  2386.         CMP.L    (A1),A0            ;YES.  Is the PC in the specified range?
  2387.         BCS.S    @2
  2388.         CMP.L    4(A1),A0
  2389.         BHI.S    @2
  2390. @11        MOVEM.L    D0/A0,-(SP)        ;If everything was successful, call the subroutine.
  2391.         BSR.S    FlipBit
  2392.         MOVE.W    8(A1),D1
  2393.         LEA    MonExecuting,A1        ;Find the address of MonExecuting.
  2394.         MOVE.B    (A1),-(SP)        ;To avoid re-entering make the Monitor think that
  2395.         MOVE.B    #$6B,(A1)        ;it is executing.
  2396.         LEA    A,A1
  2397.         JSR    0(A1,D1.W)
  2398.         LEA    MonExecuting,A1        ;Find the address of MonExecuting.
  2399.         MOVE.B    (SP)+,(A1)
  2400.         BSR.S    FlipBit
  2401.         TST.W    D0            ;Check the return code.
  2402.         BNE.S    @12            ;If nonzero, show an error.
  2403.         MOVE    #@13-A,D0
  2404.         MOVE.B    UserInform,D1        ;Check UserInform.
  2405.         BMI.S    @12            ;If an interrupt took place, fall into the Monitor.
  2406.         MOVEM.L    (SP)+,D0/A0        ;Otherwise exit.
  2407.         MOVE.L    nasty0,0        ;Trash location zero.
  2408.         RTS
  2409. @13        TRAPMon    'Interrupt'
  2410.  
  2411. @12        ADD.W    #12,SP            ;Dispose the return address and D0, D1, and A1.
  2412.         MOVE.L    4+4*4(SP),4*4(SP)
  2413.         LEA    A,A0
  2414.         LEA    (A0,D0.W),A0        ;Fall into the Monitor with the appropriate message.
  2415.         MOVE.L    A0,4+4*4(SP)
  2416.         MOVEM.L    (SP)+,D0/D1/A0/A1/A5
  2417.         RTS                ;Jump to the appropriate TRAP #$F instruction.
  2418.  
  2419.  
  2420. ;This routine flips a bit in the upper left corner.
  2421.  
  2422. FlipBit
  2423.         MOVE.B    #1,CrsrBusy        ;Mark the cursor busy.
  2424.  
  2425.         CMP.W    #$A700,CrsrAddr+2    ;Is the cursor in the upper left?
  2426.         BNE.S    NoCursorFlip
  2427. CursorFlip
  2428.         BCHG    #7,CrsrSave        ;Flip the bit in the area under the cursor.
  2429. NoCursorFlip
  2430.         BCHG    #7,$3FA700        ;Flip the bit on the screen.
  2431.  
  2432.         CLR.B    CrsrBusy        ;The cursor isn't busy any more.
  2433.         RTS
  2434.  
  2435. ;This routine turns the A000 subhooks on and off.
  2436.  
  2437. A000
  2438.         SUBQ.B    #1,D7
  2439.         BCS.S    @4            ;No arguments given.  Delete the intercepting
  2440.         BNE.S    @1            ;subroutine.
  2441.         MOVE.W    D0,D1            ;If one argument is given, the second argument
  2442. @1        AND.W    #$1FF,D0        ;is set to the first one.
  2443.         AND.W    #$1FF,D1
  2444.         CMP.W    D0,D1
  2445.         BCC.S    @2            ;Make sure D0<=D1.
  2446.         EXG    D0,D1
  2447. @2        CLR.W    (A0)+            ;The subroutine is installed.
  2448.         MOVE.W    D0,(A0)+        ;Store the two arguments.
  2449.         MOVE.W    D1,(A0)+        ;Install the subroutine.
  2450.         SUBQ.B    #3,D7
  2451.         BNE.S    @4            ;If there is no PC range, indicate that fact.
  2452.         MOVE.L    Lo3Bytes,D4        ;Clear the high bytes of the two addresses.
  2453.         AND.L    D4,D2
  2454.         AND.L    D4,D3
  2455.         CMP.L    D2,D3
  2456.         BCC.S    @3            ;Make sure D2<=D3.
  2457.         EXG    D2,D3
  2458. @3        MOVE.L    D2,(A0)+        ;Store the PC range.
  2459.         MOVE.L    D3,(A0)+
  2460.         BRA.S    A000OnOff
  2461. @4        ST    (A0)
  2462.  
  2463.  
  2464. ;This routine turns the A000 dispatcher on or off depending on the situation
  2465.  
  2466. A000OnOff
  2467.         MOVE.W    #A000Hook-A,_A000Hook-A(A2)
  2468.         MOVE.B    TrapRList,D0        ;The subroutine isn't installed.
  2469.         BEQ.S    @1
  2470.         MOVE.B    TrapSList,D0
  2471.         BEQ.S    @1
  2472.         MOVE.B    TrapDList,D0
  2473.         BEQ.S    @1
  2474.         MOVE.B    TrapCList,D0
  2475.         BEQ.S    @1
  2476.         MOVE.B    TrapIList,D0
  2477.         BEQ.S    @1
  2478.         MOVE.B    TrapGList,D0
  2479.         BEQ.S    @1
  2480.         CLR.W    _A000Hook-A(A2)        ;Remove the subroutine.
  2481. @1        RTS
  2482.  
  2483.  
  2484.         ;############################
  2485.         ;##                        ##
  2486.         ;##  A000 subhook section  ##
  2487.         ;##                        ##
  2488.         ;############################
  2489.  
  2490.  
  2491. ;
  2492. ;The following are the subhooks for A000 trap intercepts.
  2493. ;
  2494.  
  2495.  
  2496. ;
  2497. ;The following is for heap check, scramble and/or purge.
  2498. ;
  2499.  
  2500. ScrambleHook
  2501.         MOVEM.L    D2-D7/A2-A6,-(SP)
  2502.         SUB.W    #$1E,D0            ;Is this a _NewPtr?
  2503.         BEQ.S    @22            ;YES.
  2504.         SUBQ.W    #$22-$1E,D0        ;NO.  Is this a _NewHandle?
  2505.         BEQ.S    @22            ;YES.
  2506.         SUBQ.W    #$27-$22,D0        ;NO.  Is this a _ReallocHandle?
  2507.         BEQ.S    @22            ;YES.
  2508.         MOVEM.L    62(SP),D1/D2/A1        ;NO.  Test for a _SetPtrSize or _SetHandleSize
  2509.         ADDQ.W    #$27-$20,D0
  2510.         BEQ.S    @21
  2511.         SUBQ.W    #$24-$20,D0
  2512.         BNE.S    @23            ;None of these.  Don't do a heap scramble.
  2513.         MOVE.L    (A1),A1            ;De-reference the handle in a _SetHandleSize
  2514. @21        SUBQ.W    #8,A1
  2515.         MOVE.L    (A1),D2            ;Get the size of the memory manager block.
  2516.         AND.L    Lo3Bytes,D2
  2517.         SUBQ.L    #8,D2            ;Subtract the size of the header.
  2518.         MOVEQ    #$0F,D3            ;Also subtract the correction value.
  2519.         AND.B    (A1),D3
  2520.         SUB.L    D3,D2
  2521.         CMP.L    D1,D2            ;Is the new size greater than the old size?
  2522.         BGE.S    @23            ;If not, don't scramble.
  2523. @22        BSR    ScrambleHeap        ;Call the ScrambleHeap routine.
  2524.         BRA.S    @24
  2525. @23        MOVEQ    #0,D0            ;If not scrambled, return error code of zero.
  2526. @24        MOVEM.L    (SP)+,D2-D7/A2-A6
  2527.         RTS
  2528.  
  2529.  
  2530. ;
  2531. ;The following is for recording each trap.
  2532. ;
  2533.  
  2534. RecordHook
  2535.         MOVEM.L    D2/A2,-(SP)
  2536.         LEA    RecordData+2,A1
  2537.         TST.B    (A1)+            ;If master switch is off, do nothing.
  2538.         BMI.S    @4
  2539.         MOVE.B    (A1)+,D2        ;Get the halting flag.
  2540.         MOVE.W    (A1)+,D1        ;Get the number of messages.
  2541.         MOVE.L    (A1),A2            ;Get the address of the table.
  2542.         TST.B    D2            ;Is halting enabled?
  2543.         BEQ.S    @1
  2544.         MOVE    #@6-A,D0        ;YES.  If the table is about to overflow, exit.
  2545.         CMP.W    -6(A1),D1
  2546.         BLS.S    @5
  2547. @1        ADDQ.W    #1,-6(A1)        ;One more message is present.
  2548.         ADDQ.W    #6,A1
  2549.         MOVE.W    (A1),D2            ;Decrement the pointer to the current message
  2550.         BNE.S    @2            ;storing place.
  2551.         MOVE.W    D1,D2
  2552. @2        SUBQ.W    #1,D2
  2553.         MOVE.W    D2,(A1)
  2554.         ASL.W    #4,D2            ;Copy the message.
  2555.         ADD.W    D2,A2
  2556.         MOVE.W    (A0),(A2)+        ;Copy the opcode.
  2557.         MOVE.W    Ticks+2,(A2)+        ;Copy the time.
  2558.         MOVE.L    A0,(A2)+        ;Copy its PC.
  2559.         BTST    #3,(A0)
  2560.         BNE.S    @3
  2561.         MOVE.L    $1A(SP),(A2)+        ;Also copy the values of D0 and A0.
  2562.         MOVE.L    $22(SP),(A2)
  2563.         BRA.S    @4
  2564. @3        MOVE.L    $38(SP),(A2)+        ;Get the values of the top 8 stack bytes.
  2565.         MOVE.L    $3C(SP),(A2)+
  2566.  
  2567. ;At this point the stack looks like this:
  2568. ;  D2   A2   Ret  B  D0   A0   Ret  D0   D1   A0   A1   Ret  A5   SR PC   stk0 stk2
  2569. ;  0000 0000 0000 00 0011 1111 1111 1111 1122 2222 2222 2222 2233 33 3333 3333 3333
  2570. ;  0123 4567 89AB CD EF01 2345 6789 ABCD EF01 2345 6789 ABCD EF01 23 4567 89AB CDEF
  2571.  
  2572. @4        MOVEQ    #0,D0            ;No errors.
  2573. @5        MOVEM.L    (SP)+,D2/A2
  2574.         RTS
  2575. @6        TRAPMon    'Record full'
  2576.  
  2577.  
  2578. ;
  2579. ;The following is for discipline.
  2580. ;
  2581.  
  2582. DisciplineHook
  2583.  
  2584. ;At this point the stack looks like this:
  2585. ;  Ret  B  D0   A0   Ret  D0   D1   A0   A1   Ret  A5   SR PC   stack
  2586. ;  0000 00 0000 1111 1111 1122 2222 2222 3333 3333 3344 44 4444 4455
  2587. ;  0123 45 6789 0123 4567 8901 2345 6789 0123 4567 8901 23 4567 8901
  2588.  
  2589.         MOVEM.L    A2/A4/A6/D7,-(SP)
  2590.         LEA    4*4+18(SP),A4        ;point A4 to the registers
  2591.         LEA    4*4+48(SP),A6        ;point A6 to the stack
  2592.  
  2593. ;At this point A6 points to the old stack and A4 points to this:
  2594. ;  D0   D1   A0   A1   Ret  A5   SR PC
  2595. ;  0000 0000 0011 1111 1111 2222 22 2222
  2596. ;  0123 4567 8901 2345 6789 0123 45 6789
  2597.  
  2598. RegD0        EQU    0(A4)
  2599. RegD1        EQU    4(A4)
  2600.  
  2601. RegA0        EQU    8(A4)
  2602. RegA1        EQU    12(A4)
  2603. RegA5        EQU    20(A4)
  2604.  
  2605. RegSR        EQU    24(A4)
  2606. RegPC        EQU    26(A4)
  2607.  
  2608. Stack0        EQU    0(A6)
  2609. Stack2        EQU    2(A6)
  2610. Stack4        EQU    4(A6)
  2611. Stack6        EQU    6(A6)
  2612. Stack8        EQU    8(A6)
  2613. Stack10        EQU    10(A6)
  2614. Stack12        EQU    12(A6)
  2615. Stack14        EQU    14(A6)
  2616. Stack16        EQU    16(A6)
  2617. Stack18        EQU    18(A6)
  2618. Stack20        EQU    20(A6)
  2619. Stack22        EQU    22(A6)
  2620. Stack24        EQU    24(A6)
  2621. Stack26        EQU    26(A6)
  2622. Stack28        EQU    28(A6)
  2623.  
  2624. ;The discipline code may trash D0, D1, A0, A1 and A2
  2625.  
  2626.         MOVE.W    (A0),D1            ;Get the actual trap word.
  2627.         BTST    #11,D1            ;Check what kind of trap.
  2628.         BNE.S    ToolboxTrap
  2629. OSTrap
  2630.         LEA    OSTraps,A0
  2631.         AND.W    #$FF,D1            ;Get the trap number.
  2632.         BRA.S    DisciplineTrap
  2633. ToolboxTrap
  2634.         BTST    #10,D1            ;Check if it is auto-pop.
  2635.         BEQ.S    @1
  2636.         ADDQ    #4,A6            ;Skip over auto-pop return address.
  2637. @1        LEA    ToolTraps,A0
  2638.         AND.W    #$1FF,D1        ;Get the trap number.
  2639. DisciplineTrap
  2640.         MOVEQ    #0,D7
  2641.  
  2642.         ADD.W    D1,D1
  2643.         MOVE.W    0(A0,D1.W),D1        ;Find the discipline code.
  2644.         BEQ.S    NoDiscipline
  2645.  
  2646.         JSR    0(A0,D1.W)        ;Call on discipline.
  2647. NoDiscipline
  2648.         MOVE.W    D7,D0            ;Return the error code.
  2649.  
  2650.         MOVEM.L    (SP)+,A2/A4/A6/D7
  2651.         RTS
  2652.  
  2653.  
  2654. ;
  2655. ;The following is for checksumming on each trap.
  2656. ;
  2657.  
  2658. ChecksumHook
  2659.         MOVE.L    D2,-(SP)
  2660.         MOVEQ    #0,D2            ;Calculate the checksum.
  2661.         MOVEM.L    ChecksumValue+2,D0/D1
  2662.         BSR    Checker
  2663.         MOVEQ    #0,D0
  2664.         CMP.W    ChecksumValue,D2    ;If the checksum matches, no error.
  2665.         BEQ.S    @1
  2666.         MOVE    #@2-A,D0        ;Otherwise report the checksum error.
  2667. @1        MOVE.L    (SP)+,D2
  2668.         RTS
  2669. @2        TRAPMon    'Checksum failed'
  2670.  
  2671.  
  2672. ;
  2673. ;The following is for trap intercept.
  2674. ;
  2675.  
  2676. InterceptHook
  2677.         MOVE    #@1-A,D0        ;Always cause an error.
  2678.         RTS
  2679. @1        TRAPMon    'Trap intercepted'
  2680.  
  2681.  
  2682. ;
  2683. ;The following is for trap signalling.
  2684. ;
  2685.  
  2686. SignalHook
  2687.         MOVEQ    #0,D0
  2688.         MOVE.B    UserInform,D1        ;Cause an error if UserInform is nonzero.
  2689.         BEQ.S    @1
  2690.         MOVE    #@2-A,D0
  2691. @1        RTS
  2692. @2        TRAPMon    'Trap signal'
  2693.  
  2694.  
  2695.         ;#########################################
  2696.         ;##                                     ##
  2697.         ;##  Heap check/scramble/purge section  ##
  2698.         ;##                                     ##
  2699.         ;#########################################
  2700.  
  2701. ;+-----------------------------------------+
  2702. ;| Check, scramble, and/or purge the Heap. |
  2703. ;+-----------------------------------------+
  2704. ;|
  2705. ;|ENTRY: ScrambleHeap
  2706. ;|
  2707. ;|OUT:  D0.L'   Zero if scramble successful; HeapError-A otherwise.
  2708. ;|
  2709. ;|Destroys D1-D7,A0-A6.
  2710. ;|
  2711.  
  2712. ScrambleHeap
  2713.         MOVE.L    SP,A2
  2714.         MOVE.B    CurrentHeap,D0
  2715.         BSR    GetZone            ;Get the requested heap zone.
  2716.         BNE    ScrambleError
  2717.         MOVE.B    PurgeAlso,D0
  2718.         BEQ.S    @1
  2719.         BSR.S    PurgeHeap
  2720. @1        LEA    48(A6),A3
  2721.         CLR.L    (A3)+
  2722. ScrambleLoop
  2723.         MOVEQ    #0,D0            ;(Give a return code of 0 if exiting.)
  2724.         CMP.L    (A6),A3            ;Exit if done.
  2725.         BEQ    ScrambleEnd
  2726.         BSR    GetBlockInfo        ;Get information about the first block.
  2727.         BMI.S    ScrambleLoop        ;If it can't be moved, fetch the next block.
  2728.         MOVE.B    CheckOnly,D2        ;If it isn't supposed to be moved, also fetch the
  2729.         BPL.S    ScrambleLoop        ;next block.
  2730.         MOVE.B    D0,D3            ;Save the information about the first block.
  2731.         MOVE.L    D1,D4
  2732.         MOVE.L    A4,A5            ;A3 is the current address.
  2733.         CMP.L    (A6),A3            ;D3 is the type of the first block.
  2734.         BEQ.S    ScrambleClr        ;D4 is the length of the first block.
  2735.         BSR    GetBlockInfo        ;A5 is the address of the first block.
  2736.         BMI.S    ScrambleClr        ;D0 is the type of the second block.
  2737.         ADD.B    D3,D0            ;D1 is the length of the second block.
  2738.         BEQ.S    Scramble2Blank        ;A4 is the address of the second block.
  2739.         BMI    ScrambleSwap
  2740.         TST.B    D3
  2741.         BEQ.S    ScrambleAlter2nd
  2742.         MOVEQ    #0,D6
  2743.         BSR.S    AlterCount        ;Get all the free areas after the block.
  2744.         BSR.S    AlterLen        ;Find their total length.
  2745.         BSR.S    Alter1st        ;Swap a block with a free area.  The block is first.
  2746.         EXG    D1,D4
  2747.         MOVE.L    A5,A0
  2748.         MOVE.L    A3,A1
  2749.         MOVE.L    D1,D0
  2750.         _BlockMove
  2751. ScrambleClr2
  2752.         MOVEQ    #4,D1            ;Don't touch the next block.
  2753.         BSR.S    ScrambleClear
  2754.         BRA.S    ScrambleLoop
  2755.  
  2756. ScrambleAlter2nd
  2757.         BSR.S    Alter2nd        ;Swap a free area with a block.  The block is
  2758.         MOVE.L    A4,A0            ;second.
  2759.         MOVE.L    A5,A1
  2760.         MOVE.L    D1,D0
  2761.         MOVE.L    D0,D5
  2762.         _BlockMove
  2763.         MOVE.L    D4,(A3)            ;Store the length of the free area.
  2764.         BRA.S    ScrambleLoop
  2765.  
  2766. Scramble2Blank
  2767.         MOVE.L    A4,A3            ;Skip past one blank block.
  2768. ScrambleClr
  2769.         TST.B    D3            ;Check if the first block is a free area.
  2770.         BNE.S    ScrambleLoop        ;If not, don't clear it.
  2771.         CMP.B    #$C1,D0            ;In the special case that the first block is a free
  2772.         BNE.S    ScrambleClr2        ;block and the second one an immovable free block,
  2773.         MOVE.L    D1,-(SP)        ;consolidate the two blocks.
  2774.         MOVEQ    #0,D1            ;Erase the first long word of the second free block
  2775.         BSR.S    ScrambleClear        ;as well.
  2776.         MOVE.L    (SP)+,D1
  2777.         ADD.L    D1,-(A5)
  2778.         BRA.S    ScrambleLoop
  2779.  
  2780. PurgeHeap
  2781.         MOVE.L    theZone,-(SP)        ;Call MaxMem to do a purge.
  2782.         MOVE.L    A6,theZone
  2783.         _MaxMem
  2784.         MOVE.L    (SP)+,theZone
  2785.         RTS
  2786.  
  2787. Alter1st
  2788.         MOVE.L    4(A5),A0        ;Adjust the handle to the first block.
  2789.         ADD.L    D1,0(A6,A0.L)
  2790.         RTS
  2791.  
  2792. AlterCount
  2793.         MOVEQ    #0,D7            ;On exit, D7 will contain the number of blocks that
  2794.         MOVE.L    A4,A1            ;were found.
  2795. @1        ADDQ.W    #1,D7
  2796.         CMP.L    (A6),A3            ;Don't go past the end of the Heap.
  2797.         BEQ.S    @2
  2798.         BSR    GetBlockInfo        ;Get a block.
  2799.         CMP.B    D0,D6            ;Does it have the desired type?
  2800.         BEQ.S    @1            ;YES.  Look at the next block.
  2801.         MOVE.L    A4,A3            ;NO.  Go to the previous block.
  2802. @2        MOVE.L    A1,A4            ;Restore A4.  A3 contains one byte past the end of
  2803.         RTS                ;the last block found.
  2804.  
  2805. Alter2nd
  2806.         MOVEQ    #$40,D6            ;Skip past any following relocatable blocks.
  2807.         BSR.S    AlterCount
  2808.         MOVE.L    A1,A3            ;Do a second pass over these blocks.
  2809. @1        BSR    GetBlockInfo
  2810.         SUB.L    D4,(A0)            ;Adjust the handles of all these blocks.
  2811.         SUBQ.W    #1,D7
  2812.         BNE.S    @1
  2813.         MOVE.L    A1,A4
  2814. AlterLen
  2815.         MOVE.L    A3,D1            ;Find the total length of the blocks that were
  2816.         SUB.L    A4,D1            ;found.
  2817.         SUBA.L    D4,A3            ;ScrambleLoop will fetch the second block.
  2818.         RTS
  2819.  
  2820. ScrambleClear
  2821.         MOVE.L    D4,(A5)+        ;Clear the first block.  (Assumes that it is a free
  2822.         SUB.L    D1,D4            ;area).
  2823.         ADD.L    D4,A5
  2824.         MOVE.L    #'XYXY',D0
  2825.         LSR.L    #1,D4            ;D4 is the number of words to clear.
  2826.         MOVE.L    D4,D1
  2827.         AND.W    #31,D1            ;Use a slower loop to clear a number of words that
  2828.         BRA.S    @2            ;is not a multiple of 32 words.
  2829. @1        MOVE.W    D0,-(A5)
  2830. @2        DBRA    D1,@1
  2831.         LSR.L    #5,D4
  2832.         BEQ.S    @5
  2833.         MOVE.L    D0,D1            ;Now use a super-fast loop to clear the rest in
  2834.         MOVE.L    D0,D2            ;multiples of 32 words.
  2835.         MOVE.L    D0,D3
  2836.         MOVE.L    D0,D7
  2837.         MOVE.L    D0,A0
  2838.         MOVE.L    D0,A1
  2839.         MOVE.L    D0,A4
  2840.         BRA.S    @4
  2841. @3        MOVEM.L    D0/D1/D2/D3/D7/A0/A1/A4,-(A5)
  2842.         MOVEM.L    D0/D1/D2/D3/D7/A0/A1/A4,-(A5)
  2843. @4        DBRA    D4,@3
  2844. @5        RTS
  2845.  
  2846. ScrambleSwap
  2847.         BSR.S    Alter2nd        ;Swap two blocks.  This may not be a very fast
  2848.         BSR.S    Alter1st        ;operation.
  2849.         MOVE.L    #160*5,D2
  2850.         CMP.L    D2,D1            ;If both blocks are large, use the slow algorithm.
  2851.         BLS.S    @1
  2852.         CMP.L    D2,D4
  2853.         BHI.S    SlowSwap
  2854. @1        MOVE.W    #160,D2            ;Use a lightning-fast algorithm if at least one
  2855.         SUB.L    D2,SP            ;block is small enough.  Reserve 160 bytes on stack.
  2856.         ADD.L    D1,A4            ;A4 now points to the end of the second block.
  2857.         CMP.L    D1,D4
  2858.         BHI.S    @10
  2859.         ADD.L    D4,D1            ;D1 now contains the total length.
  2860. @2        MOVE.L    D2,D0            ;The first block is the smaller one.
  2861.         SUB.L    D2,D4
  2862.         BCC.S    @3            ;Put either 160 or the remaining length of the first
  2863.         ADD.L    D2,D4            ;block into D0, whichever is smaller.
  2864.         MOVE.L    D4,D0
  2865.         MOVEQ    #0,D4
  2866. @3        MOVE.L    A5,A0            ;Save D0 bytes from the beginning of the first
  2867.         MOVE.L    SP,A1            ;block.
  2868.         BSR.S    FastPush
  2869.         MOVE.L    A5,A1            ;Shift the remaining bytes to lower memory to cover
  2870.         NEG.L    D0            ;the hole that was created.
  2871.         ADD.L    D1,D0
  2872.         _BlockMove
  2873.         MOVE.L    SP,A0            ;Store the saved bytes at the end of the second
  2874.         MOVE.L    A4,A1            ;block.
  2875.         SUB.W    D3,A1
  2876.         BSR.S    FastPull
  2877.         TST.L    D4
  2878.         BNE.S    @2            ;If the swap isn't complete, shift again.
  2879.         BRA.S    @20
  2880.  
  2881. @10        ADD.L    D1,D4            ;D4 now contains the total length.
  2882. @11        MOVE.L    D2,D0
  2883.         SUB.L    D2,D1
  2884.         BCC.S    @12            ;Put either 160 or the remaining length of the
  2885.         ADD.L    D2,D1            ;second block into D0, whichever is smaller.
  2886.         MOVE.L    D1,D0
  2887.         MOVEQ    #0,D1
  2888. @12        MOVE.L    A4,A0            ;Save D0 bytes from the end of the second block.
  2889.         SUB.W    D0,A0
  2890.         MOVE.L    SP,A1
  2891.         BSR.S    FastPush
  2892.         MOVE.L    A5,A0            ;Shift the remaining bytes to higher memory to cover
  2893.         MOVE.L    A5,A1            ;the hole that was created.
  2894.         ADD.W    D0,A1
  2895.         NEG.L    D0
  2896.         ADD.L    D4,D0
  2897.         _BlockMove
  2898.         MOVE.L    SP,A0            ;Store the saved bytes at the beginning of the
  2899.         MOVE.L    A5,A1            ;first block.
  2900.         BSR.S    FastPull
  2901.         TST.L    D1
  2902.         BNE.S    @11            ;If the swap isn't complete, shift again.
  2903. @20        ADD.L    D2,SP            ;Release the memory reserved on the stack and exit.
  2904. toScrambleLoop    BRA    ScrambleLoop
  2905.  
  2906. FastPush
  2907.         MOVE.W    D0,D3
  2908. FastPull
  2909.         LSR.W    #2,D3            ;This is a semi-efficient block move routine that
  2910.         BCC.S    @2            ;doesn't have the overhead of calling _BlockMove.
  2911.         MOVE.W    (A0)+,(A1)+
  2912.         BRA.S    @2
  2913. @1        MOVE.L    (A0)+,(A1)+
  2914. @2        DBRA    D3,@1
  2915.         MOVE.W    D0,D3
  2916.         RTS
  2917.  
  2918. SlowSwap
  2919.         BSR.S    SlowScramble        ;Call the subroutine and go back to the main loop.
  2920.         BRA.S    toScrambleLoop
  2921.  
  2922. SlowScramble
  2923.         MOVE.L    A4,A0            ;This is a slower algorithm used for larger blocks.
  2924.         ADD.L    D1,A0            ;A0 is one byte beyond the last byte to be moved.
  2925.         ADD.L    D4,D1
  2926.         MOVE.L    D1,D7            ;D7 is now the total length.
  2927.         LSR.L    #1,D1            ;D1 is now the total length/2.
  2928.         BRA.S    @4
  2929. @5        ADD.L    D7,A1            ;In this loop, continue to swap the word in the
  2930.         CMP.L    A0,A1            ;register with the next word in the memory until
  2931.         BNE.S    @2            ;the two blocks are transposed.  Do not swap any
  2932.         MOVE.W    D2,(A1)            ;of the words more than once; if that is about to
  2933. @4        MOVE.W    -(A0),D2        ;happen, move the pointer to the preceeding word.
  2934.         MOVE.L    A0,A1
  2935.         BRA.S    @3
  2936. @1        SUB.L    D4,A1
  2937.         CMP.L    A5,A1
  2938.         BLT.S    @5
  2939. @2        MOVE.W    (A1),D3
  2940.         MOVE.W    D2,(A1)
  2941.         MOVE.W    D3,D2
  2942. @3        DBRA    D1,@1
  2943.         SUB.L    val10000,D1
  2944.         BCC.S    @1
  2945.         RTS
  2946.  
  2947. ;+--------------------------+
  2948. ;| Get either the system or |
  2949. ;| application heap zone.   |
  2950. ;| Avoid address errors.    |
  2951. ;+--------------------------+
  2952. ;|
  2953. ;|ENTRY: GetZone
  2954. ;|
  2955. ;|IN:   Z: flag set for system zone, clear for application zone.
  2956. ;|
  2957. ;|OUT:  D0.L'   ^heap zone.
  2958. ;|      A6'     ^heap zone (same as D0.L').
  2959. ;|
  2960. ;|Destroys A3.
  2961. ;|
  2962.  
  2963. GetZone        BNE.S    @1            ;Get the requested heap zone and put it into D0 and
  2964.         LEA    SysZone,A3        ;A6, relying on the zero flag on entry:
  2965.         BRA.S    @2            ;Z set for system zone, clear for application zone.
  2966. @1        LEA    ApplZone,A3
  2967. @2        MOVE.L    (A3),D0
  2968.         BCLR    #0,D0            ;If the address is odd, make it even.
  2969.         MOVEA.L    D0,A6
  2970.         RTS
  2971.  
  2972.  
  2973. ;+------------------------------------------------+
  2974. ;| Examine one heap block.  If an error is found, |
  2975. ;| MOVE.L A2,SP,  MOVE #HeapError-A,D0,  and RTS  |
  2976. ;| are executed.                                  |
  2977. ;+------------------------------------------------+
  2978. ;|
  2979. ;|ENTRY: GetBlockInfo
  2980. ;|
  2981. ;|IN:   A3:     ^block's header.
  2982. ;|      A6:     ^heap zone that contains the block.
  2983. ;|      A2:     SP to use in case an error is found.
  2984. ;|
  2985. ;|OUT:  If an error was found, the error routine is entered.  Otherwise,
  2986. ;|      A3'     ^next block's header.
  2987. ;|      A4'     A3:
  2988. ;|      D1.L'   length of this block.
  2989. ;|      CCR'    represents TST.B D0'.
  2990. ;|      D0.B'   block type ($00,$40,$80,$C0,$C1).
  2991. ;|         =$00'    free block.
  2992. ;|         =$40'    relocatable block.
  2993. ;|              D2.L'   handle value.
  2994. ;|              A0'     handle address.
  2995. ;|         =$80'    non-relocatable block.
  2996. ;|         =$C0'    locked relocatable block.
  2997. ;|         =$C1     a free block that shouldn't be moved.
  2998. ;|
  2999. ;|Destroys A0.
  3000. ;|
  3001.  
  3002. GetBlockInfo
  3003.         MOVE.L    A3,A4            ;Save A3.
  3004.         MOVE.B    (A3),D0            ;Get the block type.
  3005.         MOVE.L    (A3)+,D1        ;Get the block length.
  3006.         MOVE.L    (A3)+,A0        ;Get the handle or heap zone address.
  3007.         AND.L    Lo3Bytes,D1
  3008.         AND.B    #$C0,D0
  3009.         BEQ.S    InfoEnd            ;If this is a free block, leave.
  3010.         BMI.S    InfoRelocatable        ;Do relocatable and illegal blocks.
  3011.         MOVEQ    #$FFFFFF80,D0        ;This is a nonrelocatable block.  The indicated heap
  3012.         CMP.L    A0,A6            ;zone address should match A6.
  3013.         BEQ.S    InfoEnd
  3014. ScrambleError
  3015.         MOVE.L    A2,SP            ;Go to the error routine.
  3016.         MOVE    #HeapError-A,D0
  3017.         RTS
  3018. HeapError    TRAPMon    'Heap error'
  3019.  
  3020. InfoRelocatable
  3021.         SUB.B    #$40,D0            ;If this is a $C0 type block, it is illegal.
  3022.         BMI.S    ScrambleError
  3023.         MOVE.L    A0,D2            ;If the handle address is odd, the block is illegal.
  3024.         LSR.B    #1,D2
  3025.         BCS.S    ScrambleError
  3026.         ADD.L    A6,A0
  3027.         MOVE.L    (A0),D2            ;If this relocatable block is locked, give it the
  3028.         BPL.S    @1            ;$C0 type.
  3029.         MOVEQ    #$FFFFFFC0,D0
  3030. @1        AND.L    Lo3Bytes,D2
  3031.         CMP.L    D2,A3            ;Make sure that this block's handle points back to
  3032.         BNE.S    ScrambleError        ;the block.
  3033. InfoEnd        SUBQ.L    #8,D1            ;Now add the length of the block to the address.
  3034.         BCS.S    ScrambleError        ;If the block size is less than eight, give an
  3035.         BTST    #0,D1            ;error.
  3036.         BNE.S    ScrambleError
  3037.         ADD.L    D1,A3
  3038.         CMP.L    (A6),A3
  3039.         BCS.S    @1
  3040.         BHI.S    ScrambleError        ;Don't allow blocks beyond the end of the Heap.
  3041.         TST.B    D0            ;If the last block is a free area, don't scramble it.
  3042.         BNE.S    @1
  3043.         MOVEQ    #$FFFFFFC1,D0
  3044. @1        ADDQ.L    #8,D1            ;Correct for the two autoincrement instructions.
  3045.         TST.B    D0
  3046. ScrambleEnd
  3047.         RTS
  3048.  
  3049.  
  3050.         ;######################
  3051.         ;##                  ##
  3052.         ;##  Label routines  ##
  3053.         ;##                  ##
  3054.         ;######################
  3055.  
  3056.  
  3057. ;+--------------------------------------------------------+
  3058. ;| Check if D2 is in a 'CODE' resource, and, if so,       |
  3059. ;| attempt to find the name of the routine containing D2. |
  3060. ;+--------------------------------------------------------+
  3061. ;|
  3062. ;|ENTRY: CodeLabelScan
  3063. ;|
  3064. ;|IN:   D2.L:   address to identify.
  3065. ;|      D0.L:   0.
  3066. ;|      D5.L:   if D2 is in a resource, offset from the resource beginning to D2.
  3067. ;|      D6.L:   if D2 is in a resource, the resource type; otherwise, 0.
  3068. ;|      D7.L:   Bits 0..15 contain the resource ID.  Bits 16..23 contain the value of _Inhibits.
  3069. ;|      A4:     if D2 is in a resource, beginning address of the heap block.  (D2:-D5:)
  3070. ;|      A3:     if D2 is in a resource, ending address of the heap block.  (D2:-D5:)
  3071. ;|      A5:     ^Monitor's variables.
  3072. ;|(D4 is initialized by the Monitor, but this routine does not use it.)
  3073. ;|
  3074. ;|OUT:  D0.L'=0   D2 could not be identified.
  3075. ;|              D2.L'   D2.L:.
  3076. ;|      D0.L'<>0  D2 was identified.
  3077. ;|              D0.L'   first four letters of name.
  3078. ;|              D1.L'   last four letters of name.
  3079. ;|              A1'     address of the routine's beginning (the LINK instruction).
  3080. ;|              D2.L'   D2.L:-A1'.
  3081. ;|
  3082. ;|Destroys D1,D3,A0,A1.
  3083. ;|
  3084.  
  3085. CodeLabelScan
  3086.         MOVEM.L    D4/D6/D7,-(SP)        ;Save registers.
  3087.         CMP.L    #'CODE',D6        ;Don't search for code routine names unless this is
  3088.         BNE.S    @10            ;a code segment.
  3089.         MOVE.L    D2,D7            ;D7 will contain D2 truncated to an even value.
  3090.         BCLR    #0,D7
  3091.         MOVE.L    D7,A0
  3092.         MOVE.L    A3,D3            ;D3 contains the number of words left to scan
  3093.         SUB.L    D7,D3            ;before giving up at $800 or finishing at the end of
  3094.         CMP.W    #$800,D3        ;the block.
  3095.         BCS.S    @1
  3096.         MOVE.W    #$800,D3
  3097. @1        LSR.W    #1,D3
  3098.         ADDQ.L    #2,D7            ;Increment the starting position pointer by 2.
  3099. @19        MOVE.W    #$4E75,D1        ;D1.W:  RTS
  3100.         MOVE.W    #$4ED0,D6        ;D6.W:  JMP (A0)
  3101.         MOVE.W    #$4E56,D4        ;D4.W:  LINK A6,#____
  3102.         BRA.S    @3
  3103. @2        MOVE.W    (A0)+,D0        ;Get the next word.
  3104.         CMP.W    D1,D0            ;Search for one of the above instructions.
  3105.         BEQ.S    @20            ;If RTS or JMP (A0) is found, investigate further.
  3106.         CMP.W    D6,D0
  3107.         BEQ.S    @20
  3108.         CMP.W    D4,D0
  3109. @3        DBEQ    D3,@2            ;If the LINK is found first, exit with no label.
  3110.         BNE.S    @10            ;If the LINK is the first instruction encountered,
  3111.         CMPA.L    D7,A0            ;leave it as it is because it may be the beginning
  3112.         BEQ.S    @19            ;of the subroutine.
  3113. @10        MOVEQ    #0,D0            ;Pass back no label code.
  3114. @11        MOVEM.L    (SP)+,D4/D6/D7        ;Return.
  3115.         RTS
  3116.  
  3117. @20        CMP.W    #4,D3            ;If there are less than eight bytes left to scan,
  3118.         BCS.S    @10            ;it's not possible to have a full name here.
  3119.         BSR.S    CheckUNLK        ;Check for an UNLK instruction before the RTS or
  3120.         BNE.S    @3            ;JMP (A0).  If not found, continue searching.
  3121.         MOVEQ    #7,D6
  3122. @21        ROL.L    #8,D0            ;Check the name to make sure that there are eight
  3123.         ROL.L    #8,D1            ;letters of valid ASCII values present.
  3124.         MOVE.B    D1,D0
  3125.         MOVE.B    (A0)+,D1
  3126.         CMP.B    #6,D6
  3127.         BCS.S    @22
  3128.         AND.B    #$7F,D1            ;Clear the high bit of the first and second bytes.
  3129. @22        CMP.B    #' ',D1            ;Anything between $20 and $7E is valid.
  3130.         BCS.S    @10
  3131.         CMP.B    #$7F,D1
  3132.         BCC.S    @10
  3133.         DBRA    D6,@21
  3134.         MOVE.W    D5,D3            ;A valid name has been found.  Now search backwards
  3135.         LSR.W    #1,D3            ;for the LINK instruction.
  3136.         MOVE.L    D7,A1
  3137. @23        CMP.W    -(A1),D4
  3138.         DBEQ    D3,@23
  3139.         BNE.S    @10            ;If run out of the block, exit.
  3140.         SUB.L    A1,D2            ;Otherwise give the offset in D2 and return
  3141.         BRA.S    @11            ;successfully.
  3142.  
  3143.  
  3144. ;+-------------------------------------------------------+
  3145. ;| Make sure that an UNLK A6 instruction exists no more  |
  3146. ;| than ten words in front of A0.  Also make sure that   |
  3147. ;| there is no LINK A6 between the UNLK A6 and A0.       |
  3148. ;+-------------------------------------------------------+
  3149. ;|
  3150. ;|ENTRY: CheckUNLK
  3151. ;|
  3152. ;|IN:   A0:     Address from which to search.
  3153. ;|
  3154. ;|OUT:  Z flag' set if the conditions above satisfied, clear otherwise.
  3155. ;|
  3156. ;|Destroys nothing.
  3157. ;|
  3158.  
  3159. CheckUNLK    MOVEM.L    D0/A0,-(SP)        ;Save registers.
  3160.         MOVEQ    #9,D0            ;Search ten words.
  3161. @1        CMP.W    #$4E5E,-(A0)        ;UNLK A6
  3162.         BEQ.S    @2
  3163.         CMP.W    #$4E56,(A0)        ;LINK A6,#____
  3164.         DBEQ    D0,@1
  3165.         MOVEQ    #-1,D0            ;If not found or LINK found first, clear Z flag.
  3166. @2        MOVEM.L    (SP)+,D0/A0        ;Return (MOVEM preserves flags).
  3167.         RTS
  3168.  
  3169.  
  3170. ;+----------------------------------+
  3171. ;| Find a given embedded routine    |
  3172. ;| 8-character name in code blocks. |
  3173. ;| See manual for details.          |
  3174. ;+----------------------------------+
  3175. ;|
  3176. ;|ENTRY: CodeLabelFind
  3177. ;|
  3178. ;|IN:   D0.L:   first four characters of the name converted to upper case.
  3179. ;|      D1.L:   last four characters of the name converted to upper case.
  3180. ;|      D7.L:   bits 16..23 contain the value of _Inhibits.
  3181. ;|      A5:     ^Monitor's variables.
  3182. ;|
  3183. ;|OUT:  D0.L'=0 the name has been found.
  3184. ;|      D2.L'   the location of the routine that has the given name.
  3185. ;|      D0.L'=D0.L: the name has not been found.
  3186. ;|
  3187. ;|Destroys D2,D3,A0,A1.
  3188. ;|
  3189.  
  3190. CodeLabelFind
  3191.         MOVEM.L    D0/D1/D4-D7/A2-A4/A6,-(SP)
  3192.         BTST    #16+3,D7        ;If can't scan resources, do nothing.
  3193.         BNE    @40
  3194.         MOVE.L    SP,A6
  3195.         MOVE.L    $A50,D1            ;Start with the first resource file.
  3196. @1        JSR    _NextCResFile        ;Check the next file.
  3197.         BEQ    @40            ;If there is none, no data will be found.
  3198.         MOVE.L    A1,A0
  3199.         MOVE.W    (A0)+,D3        ;D3 has the number of types+1.
  3200.         MOVE.L    #'CODE',D2
  3201. @11        CMP.L    (A0)+,D2
  3202.         ADDQ.W    #4,A0            ;Look for blocks of type 'CODE'.
  3203.         DBEQ    D3,@11
  3204.         BNE.S    @1            ;If not found, scan the next file.
  3205.         MOVE.W    -(A0),D0
  3206.         ADD.W    D0,A1            ;Find the ID list and check for address errors.
  3207.         LSR.W    #1,D0
  3208.         BCS.S    @1
  3209.         MOVE.W    -(A0),D6        ;D6 now has the number of 'CODE' IDs in the table.
  3210. @12        ADDQ.W    #8,A1
  3211.         MOVE.L    (A1)+,A0        ;See if this 'CODE' segment is legally in memory.
  3212.         BSR    IndirectA0
  3213.         BCS.S    @50            ;NO.
  3214.         TST.W    -12(A1)            ;YES.  If its ID is zero, however, do not scan it.
  3215.         BEQ.S    @50
  3216.         MOVE.L    -8(A0),D0
  3217.         AND.L    Lo3Bytes,D0
  3218.         MOVEQ    #$0F,D2
  3219.         AND.B    -8(A0),D2        ;Subtract the size correction from the size.
  3220.         SUB.L    D2,D0
  3221.         MOVEQ    #8,D2
  3222.         SUB.L    D2,D0
  3223.         BMI.S    @50            ;If a negative number results, skip to the next
  3224.         LSR.L    #1,D0            ;block.
  3225.         CMP.L    #$8000,D0
  3226.         BCS.S    @13
  3227.         MOVE.L    #$7FFF,D0
  3228. @13        MOVE.W    #$4E56,D2        ;D2.W:  LINK A6,#____
  3229.         MOVE.W    #$4E75,D3        ;D3.W:  RTS
  3230.         MOVE.W    #$4ED0,D4        ;D4.W:  JMP (A0)
  3231.         BRA.S    @21
  3232. @20        CMP.W    (A0)+,D2        ;Search for a LINK instruction.
  3233. @21        DBEQ    D0,@20
  3234.         BNE.S    @50            ;Not found within the block.
  3235. @22        MOVEA.L    A0,A2            ;Save the address and look for either RTS or
  3236.         BRA.S    @24            ;JMP (A0).
  3237. @23        MOVE.W    (A0)+,D5
  3238.         CMP.W    D5,D3
  3239.         BEQ.S    @30
  3240.         CMP.W    D5,D4
  3241.         BEQ.S    @30
  3242.         CMP.W    D5,D2            ;If another LINK is found first, restart this loop.
  3243. @24        DBEQ    D0,@23
  3244.         BNE.S    @50
  3245.         MOVEQ    #-1,D5            ;Clear the Z flag and search again.
  3246.         BRA.S    @22
  3247. @30        BSR    CheckUNLK        ;Check for an UNLK instruction before the RTS or
  3248.         BNE.S    @24            ;JMP (A0).
  3249.         BSR.S    CheckName
  3250.         BNE.S    @21
  3251.         SUBQ.W    #2,A2
  3252.         MOVE.L    A2,D2
  3253.         CLR.L    (SP)            ;Clear D0 on the stack image.
  3254. @40        MOVEM.L    (SP)+,D0/D1/D4-D7/A2-A4/A6
  3255.         RTS
  3256.  
  3257. @50        DBRA    D6,@12            ;Examine the next block, or, if there are no more,
  3258.         BRA    @1            ;the next file.
  3259.  
  3260.  
  3261. ;+---------------------------------------------------------------------------------+
  3262. ;| Compare the names at (A0)+ and (A6)+.  Convert the name at (A0)+ to upper case  |
  3263. ;| and clear the 7th bit in its first 2 characters for the purpose of comparison.  |
  3264. ;| The name at (A6)+ is assumed to be in upper case, as it will be if it was       |
  3265. ;| generated by the Monitor.  Both names must be eight characters long.            |
  3266. ;+---------------------------------------------------------------------------------+
  3267. ;|
  3268. ;|ENTRY: CheckName
  3269. ;|
  3270. ;|IN:   A0:     string1, upper or lower case, 7th bit clear or set on first character.
  3271. ;|      A6:     string2, upper case only, 7th bit clear.
  3272. ;|
  3273. ;|OUT:  Z flag' set if uppercase(string1)=string2
  3274. ;|              clear otherwise.
  3275. ;|
  3276. ;|Destroys nothing.
  3277. ;|
  3278.  
  3279. CheckName
  3280.         MOVEM.L    D0/D1/A1/A2,-(SP)
  3281.         MOVEQ    #7,D0            ;Compare eight characters.
  3282.         MOVE.L    A6,A1            ;Use copies of A0 and A6.
  3283.         MOVE.L    A0,A2
  3284. @4        MOVEQ    #$7F,D1            ;Clear the high bit of the first character.
  3285.         AND.B    (A2)+,D1
  3286.         BRA.S    @3
  3287. @1        CMP.B    #6,D0
  3288.         BHS.S    @4
  3289.         MOVE.B    (A2)+,D1
  3290. @3        CMP.B    #'a',D1            ;Convert to upper case.
  3291.         BCS.S    @2
  3292.         CMP.B    #'z'+1,D1
  3293.         BCC.S    @2
  3294.         SUB.B    #$20,D1
  3295. @2        CMP.B    (A1)+,D1        ;Compare and exit as soon as a mismatch is found or
  3296.         DBNE    D0,@1            ;eight characters match.
  3297.         MOVEM.L    (SP)+,D0/D1/A1/A2
  3298.         RTS
  3299.  
  3300.  
  3301. ;+---------------------------+
  3302. ;| Find a given 8-character  |
  3303. ;| label in the label table. |
  3304. ;| See manual for details.   |
  3305. ;+---------------------------+
  3306. ;|
  3307. ;|ENTRY: LabelFind
  3308. ;|
  3309. ;|IN:   D0.L:   first four characters of the name converted to upper case.
  3310. ;|      D1.L:   last four characters of the name converted to upper case.
  3311. ;|      D7:     bits 16..23 contain the value of _Inhibits.
  3312. ;|      A5:     ^Monitor's variables.
  3313. ;|
  3314. ;|OUT:  D0.L'=0 the name has been found.
  3315. ;|              D2.L'   the location of the routine that has the given name.
  3316. ;|      D0.L'=D0.L: the name has not been found.
  3317. ;|              D2.L'   unpredictable.
  3318. ;|
  3319. ;|Destroys D3,A0,A1.
  3320. ;|
  3321. ;|
  3322. ;|ENTRY: LabelFind.
  3323. ;|
  3324. ;|Same as LabelFind except that if D2.B is nonzero, the subroutine will not check if the resource is in
  3325. ;|memory for resource-relative labels.  Moreover, the address of the label will be passed back in
  3326. ;|A0 if the label is found.  However the address of built-in labels is never returned.
  3327. ;|
  3328.  
  3329. LabelFind
  3330.         MOVEQ    #0,D2
  3331. LabelFind.
  3332.         MOVE.B    LabelEnabled,D3        ;If there is no table of labels, do nothing.
  3333.         MOVEM.L    D0/D1/D5/D6/A3/A4/A6,-(SP)
  3334.         MOVE.L    SP,A6            ;A6 points to the saved name on the stack.
  3335.         BMI.S    @20
  3336.         MOVE.L    LabelTable,A0
  3337.         SUBQ.W    #8,A0
  3338.         MOVE.W    NumLabels,D3
  3339.         MOVEQ    #-1,D0            ;Clear the Z flag.
  3340.         BRA.S    @2
  3341. @1        ADD.W    #16,A0            ;Check the names in the label table.
  3342.         BSR.S    CheckName
  3343. @2        DBEQ    D3,@1
  3344.         BEQ.S    @21            ;If found, continue
  3345. @20        LEA    UALabelTable+8,A0    ;Point to built in label table.
  3346.         MOVE.W    #NumUALabels,D3
  3347.         MOVEQ    #-1,D0
  3348.         BRA.S    @22
  3349. @23        ADD.W    #16,A0
  3350.         BSR.S    CheckName
  3351. @22        DBEQ    D3,@23
  3352. @21        BNE.S    @10            ;If no match, exit.
  3353.         MOVE.L    -(A0),D3        ;Determine whether this is an absolute or
  3354.         MOVE.B    D2,D0            ;resource-relative label.
  3355.         MOVE.L    -(A0),D2
  3356.         TST.B    (A0)
  3357.         BEQ.S    @3            ;If absolute, exit successfully.
  3358.         TST.B    D0
  3359.         BNE.S    @3            ;If supposed to pass back label address, exit now.
  3360.         BTST    #16+3,D7        ;If resource-relative, resource scanning must not be
  3361.         BNE.S    @10            ;inhibited!
  3362.         SWAP    D3
  3363.         JSR    _FindRes        ;Find the desired resource, and, if all is well,
  3364.         TST.B    D0            ;add the offset to its beginning.
  3365.         BNE.S    @10
  3366.         CLR.W    D3
  3367.         SWAP    D3
  3368.         ADD.L    D3,D2
  3369. @3
  3370.         LEA    UALabelTable,A1
  3371.         CMP.L    A1,A0
  3372.         BLO.S    @24
  3373.         LEA    UALabelTableEnd,A1
  3374.         CMP.L    A1,A0
  3375.         BHS.S    @24
  3376.         MOVEQ    #0,D0
  3377.         MOVE.L    D0,A0            ;Do NOT return a pointer for built-ins
  3378. @24        CLR.L    (SP)            ;Clear D0 on the stack image.
  3379. @10        MOVEM.L    (SP)+,D0/D1/D5/D6/A3/A4/A6
  3380. @11        RTS
  3381.  
  3382.  
  3383. ;+------------------------------------+
  3384. ;| Search the label table for a label |
  3385. ;| that could be used to identify D2. |
  3386. ;| The resource-relative labels will  |
  3387. ;| be ignored if D6 is 0.             |
  3388. ;+------------------------------------+
  3389. ;|
  3390. ;|ENTRY: LabelScan
  3391. ;|
  3392. ;|IN:   D2.L:   address to identify.
  3393. ;|      D0.L:   0.
  3394. ;|      D5.L:   if D2 is in a resource, offset from the resource beginning to D2.
  3395. ;|      D6.L:   if D2 is in a resource, the resource type; otherwise, 0.
  3396. ;|      D7.L:   Bits 0..15 contain the resource ID.  Bits 16..23 contain the value of _Inhibits.
  3397. ;|      A4:     if D2 is in a resource, beginning address of the heap block.  (D2:-D5:)
  3398. ;|      A3:     if D2 is in a resource, ending address of the heap block.  (D2:-D5:)
  3399. ;|      A5:     ^Monitor's variables.
  3400. ;|(D4 is initialized by the Monitor, but this routine does not use it.)
  3401. ;|
  3402. ;|OUT:  D0.L'=0   D2 could not be identified.
  3403. ;|              D2.L'   D2.L:.
  3404. ;|      D0.L'<>0  D2 was identified.
  3405. ;|              D0.L'   first four letters of name.
  3406. ;|              D1.L'   last four letters of name.
  3407. ;|              D2.L'   offset from the label to D2.L.
  3408. ;|
  3409. ;|Destroys D1,D3,A0,A1.
  3410. ;|
  3411.  
  3412. LabelScan
  3413.         MOVE.B    LabelEnabled,D3        ;If there is no table of labels, do nothing.
  3414.         MOVEM.L    D4/D5,-(SP)        ;Save registers.
  3415.         BMI.S    @20
  3416.         MOVE.L    LabelTable,A0
  3417.         MOVE.W    NumLabels,D3
  3418.         MOVEQ    #-1,D5            ;Assume that the best fit was 4294967295 bytes off.
  3419.         BRA.S    @10
  3420. @1        MOVE.L    A0,A1            ;Which type of a label is this?
  3421.         TST.B    (A1)
  3422.         BEQ.S    @2
  3423.         CMP.L    (A1)+,D6        ;Resource-type.  The resource type and ID must
  3424.         BNE.S    @5            ;match exactly.
  3425.         CMP.W    (A1)+,D7
  3426.         BNE.S    @5
  3427.         MOVEQ    #0,D4            ;Get the address pointed by this label into D4.
  3428.         MOVE.W    (A1)+,D4
  3429.         ADD.L    A4,D4
  3430.         BRA.S    @3
  3431. @2        MOVE.L    (A1)+,D4        ;Absolute-type.  The given location must be below
  3432.         CMP.L    (A1)+,D2        ;the maximum address given.  If it is, get the
  3433.         BCC.S    @5            ;address pointed by this label into D4.
  3434. @3        SUB.L    D4,D2
  3435.         BCS.S    @4            ;Calculate the difference between D4 and the
  3436.         CMP.L    D5,D2            ;location given, and check if this is a closest
  3437.         BCC.S    @4            ;match.
  3438.         MOVE.L    D2,D5
  3439.         MOVE.L    (A1)+,D0        ;If so, copy the name into D0 and D1 and the
  3440.         MOVE.L    (A1),D1            ;difference into D5.
  3441. @4        ADD.L    D4,D2
  3442. @5        ADD.W    #16,A0
  3443. @10        DBRA    D3,@1
  3444.         LEA    UALabelTableEnd,A1    ;Check if we were scanning the built in table.
  3445.         CMP.L    A0,A1
  3446.         BEQ.S    @21            ;If so, we are done
  3447. @20        LEA    UALabelTable,A0
  3448.         MOVE.W    #NumUALabels,D3
  3449.         BRA.S    @10
  3450. @21        TST.L    D0            ;If a good label has been found, put the difference
  3451.         BEQ.S    @11            ;into D2.
  3452.         MOVE.L    D5,D2
  3453. @11        MOVEM.L    (SP)+,D4/D5        ;Restore registers.
  3454. @12        RTS
  3455.  
  3456.  
  3457.         ;####################################
  3458.         ;##                                ##
  3459.         ;##  Heap identification routines  ##
  3460.         ;##                                ##
  3461.         ;####################################
  3462.  
  3463.  
  3464.         STRING_FORMAT    2        ;Precede strings with length byte.
  3465.  
  3466. Heap.V1
  3467.         DC    GrayRgn            ;Locations of some low memory locations that
  3468.         DC    MenuList        ;contain handles.
  3469.         DC    TEScrpHandle        ;To add more, instert additional addresses here and
  3470.         DC    ScrapHandle        ;put their names into Heap.L1.
  3471.         DC    SaveVisRgn
  3472. Heap.V1End
  3473.  
  3474. Heap.V2
  3475.         DC.B    visRgn,clipRgn,picSave,rgnSave,polySave
  3476.         DC.B    structRgn,contRgn,updateRgn
  3477.         DC.B    wDataHandle,wTitleHandle,windowPic
  3478.         DC.B    items,teHandle        ;Only in dialog windows.
  3479.  
  3480. Heap.FInfo    DC.B    'FinderInfo'
  3481. Heap.Control    DC.B    'Control'
  3482. Heap.DI        DC.B    'Item #$'
  3483. Heap.DI2    DC.B    ' Type $'
  3484. Heap.W2        DC.B    '(Window @$'
  3485. Heap.ParamText    DC.B    'ParamText'
  3486. Heap.Window    DC.B    'Window #$'
  3487. Heap.Kind    DC.B    ', Kind $'
  3488. Heap.Map    DC.B    'Resource map $'
  3489. Heap.WMgrPort    DC.B    'WMgrPort'
  3490. Heap.RPSpace    DC.B    ') '
  3491. Heap.RP8Spaces    DC.B    ')        '
  3492.  
  3493. Heap..
  3494. Heap.L1
  3495.         DC.B    'GrayRgn'        ;See Heap.V1 on how to add more names here.
  3496.         DC.B    'MenuList'
  3497.         DC.B    'TEScrap'
  3498.         DC.B    'Scrap'
  3499.         DC.B    'SaveVisRgn'
  3500. Heap.L2
  3501.         DC.B    'VisRgn','ClipRgn','PicSave','RgnSave','PolySave'
  3502.         DC.B    'StructRgn','ContRgn','UpdateRgn'
  3503.         DC.B    'WData','WTitle','WPic'
  3504.         DC.B    'Items','TEHandle'
  3505.  
  3506.         .ALIGN    2
  3507.  
  3508.         STRING_FORMAT 0            ;Normal strings
  3509.  
  3510. ;+--------------------------------+
  3511. ;| Identify the heap block at A3. |
  3512. ;+--------------------------------+
  3513. ;|
  3514. ;|ENTRY: HeapIdentify
  3515. ;|
  3516. ;|IN:   D3.W:   0 if nonrelocatable block, 1 if relocatable block, 2 if resource relocatable block.
  3517. ;|      A1:     ^heap zone containing the block.
  3518. ;|      A2:     ^text area for the information about the block.
  3519. ;|      A3:     ^block.
  3520. ;|      A4:     another pointer into the text area.  See the manual.
  3521. ;|      A5:     ^Monitor's variables.
  3522. ;|      A6:     ^handle if this is a relocatable block.
  3523. ;|
  3524. ;|OUT:  A2'     A2: moved past the text stored.
  3525. ;|
  3526. ;|Destroys D0-D7,A0,A1,A3,A4,A6.
  3527. ;|
  3528.  
  3529. HeapIdentify
  3530.         SUBQ.W    #1,D3            ;Look only at unidentified relocatable blocks and
  3531.         BEQ.S    Heap.Relocatable        ;nonrelocatable blocks.
  3532.         BCC.S    Heap.RTS
  3533.         MOVEQ    #18,D1            ;This is a nonrelocatable block.  Print 19 spaces.
  3534.         MOVEQ    #' ',D0
  3535. @1        MOVE.B    D0,(A2)+
  3536.         DBRA    D1,@1
  3537.         CMP.L    WMgrPort,A3        ;Is this the Window Manager
  3538.         BNE.S    @2            ;port?
  3539.         MOVEQ    #Heap.WMgrPort-Heap..,D7
  3540.         BRA.S    Heap.PString
  3541.  
  3542. @2        LEA    WindowList-nextWindow,A0;Scan the window list to check if this block is in
  3543.         MOVEQ    #-1,D0            ;it.
  3544. @3        MOVE.L    nextWindow(A0),A0
  3545.         ADDQ.B    #1,D0
  3546.         BSR    CheckA0
  3547.         BCS.S    Heap.RTS        ;The list is over; quit.
  3548.         CMP.L    A0,A3
  3549.         BNE.S    @3
  3550.         MOVEQ    #Heap.Window-Heap..,D7    ;This block is in the list.
  3551.         BSR.S    Heap.PString
  3552.         JSR    _Put2Dig        ;Display both the window number and kind.
  3553.         MOVEQ    #Heap.Kind-Heap..,D7
  3554.         MOVE.W    windowKind(A0),D0
  3555. Heap.S.D    BSR.S    Heap.PString        ;Print a string and then a number.
  3556.         JMP    _Put4Dig
  3557.  
  3558.  
  3559. ;+----------------------------------------------------+
  3560. ;| Transfer a string from the string list onto (A2)+. |
  3561. ;+----------------------------------------------------+
  3562. ;|
  3563. ;|ENTRY: Heap.IString
  3564. ;|
  3565. ;|IN:   A2:     ^destination text.
  3566. ;|      D1.W:   string number (0=first, 1=second, etc.)
  3567. ;|      D7.W:   offset to the first string from Heap..
  3568. ;|
  3569. ;|OUT:  A2'     A2: moved past the copied string.
  3570. ;|
  3571. ;|Destroys D1,D7.
  3572. ;|
  3573. ;|ENTRY: Heap.PString
  3574. ;|
  3575. ;|Same as above, except that D1.W: is set to zero.
  3576. ;|
  3577.  
  3578. Heap.PString    MOVEQ    #0,D1            ;Get the first string encountered in list.
  3579. Heap.IString    MOVE.L    A0,-(SP)        ;Get the D1th string after the one at Heap..+D7.
  3580.         LEA    Heap..,A0        ;A0 was saved.
  3581.         ADD.W    D7,A0
  3582.         MOVEQ    #0,D7
  3583.         BRA.S    @1
  3584. @2        ADD.W    D7,A0
  3585. @1        MOVE.B    (A0)+,D7        ;Get the length of a string.
  3586.         DBRA    D1,@2            ;If indexing, skip past that string.
  3587.         BRA.S    @3
  3588. @4        MOVE.B    (A0)+,(A2)+        ;Copy the string into the destination.
  3589. @3        DBRA    D7,@4
  3590.         MOVE.L    (SP)+,A0        ;Restore A0 and exit.
  3591. Heap.RTS    RTS
  3592.  
  3593. Heap.Relocatable
  3594.         MOVE.W    #'  ',(A2)+        ;Print two spaces.
  3595.         MOVE.L    CurrentA5,A0
  3596.         BSR.S    @49            ;Check if this block is the Finder information
  3597.         BCS.S    @1            ;handle.
  3598.         MOVEQ    #Heap.FInfo-Heap..,D7
  3599.         CMP.L    16(A0),A6
  3600.         BEQ.S    Heap.PString        ;Yes.  Print the appriopriate information.
  3601. @1        MOVEQ    #(Heap.V1End-Heap.V1)/2-1,D1
  3602.         LEA    Heap.V1End,A0
  3603.         MOVEQ    #0,D7            ;Check if the low memory locations have
  3604. @2        MOVE.W    -(A0),A4        ;handles to this block.
  3605.         CMP.L    (A4),A6
  3606.         BEQ.S    Heap.IString
  3607.         DBRA    D1,@2
  3608.         MOVEQ    #'0',D2            ;Check the four ParamText locations.
  3609.         LEA    DAStrings,A0
  3610. @3        CMP.L    (A0)+,A6
  3611.         BNE.S    @4
  3612.         MOVEQ    #Heap.ParamText-Heap..,D7
  3613.         BSR.S    Heap.PString
  3614.         MOVE.B    D2,(A2)+
  3615. @9        RTS
  3616. @4        ADDQ.B    #1,D2
  3617.         CMP.B    #'4',D2
  3618.         BNE.S    @3
  3619.         LEA    TopMapHndl-nextMap,A0    ;Scan the resource file list.
  3620. @10        MOVE.L    nextMap(A0),A0
  3621.         BSR    IndirectA0        ;If there is a problem indirecting, abandon scan.
  3622.         BCS.S    @11
  3623.         CMP.L    A0,A3            ;Is this the desired block?
  3624.         BNE.S    @10            ;NO. Scan more.
  3625.         MOVEQ    #Heap.Map-Heap..,D7    ;YES.  Give information.
  3626.         MOVE.W    resFileID(A0),D0
  3627.         BRA    Heap.S.D        ;Exit.
  3628.  
  3629. @49        BRA    CheckA0
  3630.  
  3631. @30        BSR    Heap.WString        ;Print the type of handle found.
  3632.         MOVEQ    #Heap.L2-Heap..,D7
  3633.         BRA    Heap.IString
  3634.  
  3635. @11        MOVEQ    #0,D3
  3636.         MOVE.L    WMgrPort,A0
  3637.         BRA.S    @50
  3638.  
  3639. @51        NOT.B    D3            ;Switch from scanning WMgrPort to the window list.
  3640.         BEQ.S    @9
  3641.         LEA    WindowList-nextWindow,A4;Scan the window list.
  3642. @12        MOVE.L    nextWindow(A4),A0
  3643. @50        BSR.S    @49
  3644.         BCS.S    @51            ;The list is over; quit.
  3645.         MOVE.L    A0,A4            ;(A4 also points to the current window.)
  3646.         MOVEQ    #4,D2
  3647.         TST.B    D3            ;If this is WMgrPort, check only the port variables.
  3648.         BEQ.S    @13
  3649.         MOVEQ    #10,D2
  3650.         CMP.W    #dialogKind,windowKind(A0)
  3651.                         ;Is this a dialog window?
  3652.         BNE.S    @13            ;NO.
  3653.         MOVEQ    #12,D2            ;YES.  There is one more handle to be checked.
  3654. @13        LEA    Heap.V2,A1        ;Check each handle in turn.
  3655.         MOVEQ    #0,D0
  3656.         MOVEQ    #-1,D1
  3657. @14        ADDQ.W    #1,D1
  3658.         MOVE.B    (A1)+,D0
  3659.         CMP.L    0(A0,D0),A6
  3660.         BEQ.S    @30            ;There is a match.
  3661.         DBRA    D2,@14
  3662.         TST.B    D3            ;If this is WMgrPort, begin scanning the window
  3663.         BEQ.S    @51            ;list.
  3664.         CMP.W    #dialogKind,windowKind(A4)
  3665.                         ;Is this a dialog window?
  3666.         BNE.S    @21            ;NO.
  3667.         MOVE.L    items(A4),A0
  3668.         BSR    IndirectA0        ;Get the item list.
  3669.         BCS.S    @21
  3670.         TST.B    (A0)            ;Don't bother checking if there are more than 256
  3671.         BNE.S    @21            ;items.
  3672.         MOVE.W    (A0)+,D0
  3673.         MOVEQ    #0,D2
  3674. @20        CMP.L    (A0)+,A6
  3675.         BEQ.S    @31            ;There is a match.
  3676.         ADD.W    #9,A0            ;Skip past the other items and the string to the
  3677.         MOVEQ    #0,D1            ;next handle.
  3678.         MOVE.B    (A0),D1
  3679.         ADDQ.W    #1,D1
  3680.         BSET    #0,D1
  3681.         ADD.W    D1,A0
  3682.         ADDQ.W    #1,D2
  3683.         DBRA    D0,@20
  3684. @21        LEA    wControlList(A4),A0    ;Prepare to scan the control list.
  3685. @22        MOVE.L    (A0),A0
  3686.         CMP.L    A0,A6            ;Does this control match the handle?
  3687.         BEQ.S    @33
  3688.         BSR.S    IndirectA0        ;NO.  Go check the next one.
  3689.         BCC.S    @22
  3690.         BRA.S    @12
  3691.  
  3692. @31        BSR.S    Heap.WString        ;Identify the current window.
  3693.         MOVEQ    #Heap.DI-Heap..,D7
  3694.         BSR.S    Heap.toPString
  3695.         MOVE.W    D2,D0
  3696.         BSR.S    @32            ;Print the item number.
  3697.         MOVEQ    #Heap.DI2-Heap..,D7
  3698.         BSR.S    Heap.toPString
  3699.         MOVE.B    8(A0),D0
  3700. @32        JMP    _Put2Dig
  3701.  
  3702. @33        BSR.S    Heap.WString        ;Identify the current window and just print that
  3703.         MOVEQ    #Heap.Control-Heap..,D7    ;this control belongs to that window.
  3704. Heap.toPString    BRA    Heap.PString
  3705.  
  3706. Heap.WString
  3707.         MOVE.W    D1,-(SP)        ;Identify the current window.
  3708.         TST.B    D3
  3709.         BNE.S    @1
  3710.         MOVE.B    #'(',(A2)+        ;This is the WMgrPort.
  3711.         MOVEQ    #Heap.WMgrPort-Heap..,D7
  3712.         BSR.S    Heap.toPString
  3713.         MOVEQ    #Heap.RP8Spaces-Heap..,D7
  3714.         BSR.S    Heap.toPString
  3715.         BRA.S    @2
  3716. @1        MOVEQ    #Heap.W2-Heap..,D7    ;Print the address of the current window.
  3717.         BSR.S    Heap.toPString
  3718.         MOVE.L    A4,D0
  3719.         JSR    _Put6Dig        ;Give the address of the window.
  3720.         MOVEQ    #Heap.RPSpace-Heap..,D7
  3721.         BSR.S    Heap.toPString
  3722. @2        MOVE.W    (SP)+,D1
  3723.         RTS
  3724.  
  3725.  
  3726. ;+-----------------------------------------------------+
  3727. ;| Dereference A0, checking it to make sure it is even |
  3728. ;| and non-NIL both before and after dereferencing.    |
  3729. ;+-----------------------------------------------------+
  3730. ;|
  3731. ;|ENTRY: IndirectA0
  3732. ;|
  3733. ;|IN:   A0:     pointer
  3734. ;|
  3735. ;|OUT:  Carry set   A0: or (A0:) was NIL or odd.
  3736. ;|              A0'     unpredictable.
  3737. ;|      Carry clear otherwise
  3738. ;|              A0'     (A0:)
  3739. ;|
  3740. ;|Destroys D7.
  3741. ;|
  3742. ;|
  3743. ;+----------------------------------------+
  3744. ;| Make sure that A0 is even and non-NIL. |
  3745. ;+----------------------------------------+
  3746. ;|
  3747. ;|ENTRY: CheckA0
  3748. ;|
  3749. ;|IN:   A0:     pointer
  3750. ;|
  3751. ;|OUT:  Carry set   A0: was NIL or odd.
  3752. ;|      Carry clear otherwise
  3753. ;|
  3754. ;|Destroys D7.
  3755. ;|
  3756.  
  3757. IndirectA0    BSR.S    CheckA0            ;Check A0 before dereferencing.
  3758.         BCS.S    CheckA0.RTS        ;If error do nothing.
  3759.         MOVE.L    (A0),A0            ;Dereference it and check again.
  3760. CheckA0        MOVE.L    A0,D7            ;Make sure that A0 is both non-NIL and even.
  3761.         BEQ.S    @1
  3762.         LSR.B    #1,D7
  3763.         RTS
  3764. @1        SUBQ.L    #1,D7            ;Set the carry flag if it isn't.
  3765. CheckA0.RTS    RTS
  3766.  
  3767.  
  3768.         ;##########################
  3769.         ;##                      ##
  3770.         ;##  Discipline section  ##
  3771.         ;##                      ##
  3772.         ;##########################
  3773.  
  3774.  
  3775. DisciplineInit
  3776.         LEA    updating,A0
  3777.         CLR.L    (A0)        ;Initialize the Begin/EndUpdate.
  3778.         RTS
  3779.  
  3780. retOK
  3781.         MOVEQ    #0,D7
  3782.         RTS
  3783. retErr
  3784.         MOVE    #%01000,CCR    ;Set the N bit to 1.
  3785.         RTS
  3786.  
  3787.         MACRO    ErrText    code,string    =
  3788. err{code}    TRAPMon    '? {string}'
  3789. retErr{code}    MOVE.W    #err{code}-A,D7
  3790.         BRA    retErr
  3791.         |
  3792.  
  3793.  
  3794. CheckRAM
  3795.  
  3796. ;Given an address in D0, this checks to see if it is even.
  3797. ;It also checks that it is between 0 and MemTop.
  3798. ;It returns D0 with the high byte masked off.
  3799.  
  3800.         BTST    #0,D0        ;odd address
  3801.         BNE.S    retErrOdd
  3802. CheckOddRAM
  3803.         AND.L    Lo3Bytes,D0    ;mask off high byte
  3804.         BEQ.S    retErrZero
  3805. CheckRAM.
  3806.         CMP.L    RealMemTop,D0
  3807.         BHS.S    retErrAddress    ;too high
  3808.  
  3809.         BRA.S    retOK
  3810.  
  3811.         ErrText    Zero,NIL address
  3812.         ErrText    Odd,odd address
  3813.         ErrText    Address,address
  3814.  
  3815. CheckROM
  3816.  
  3817. ;Given an address in D0, this checks to see if it is even.
  3818. ;It also checks that it is between $400000 and $40FFFF.
  3819. ;It returns D0 with the high byte masked off.
  3820.  
  3821.         BTST    #0,D0        ;odd address
  3822.         BNE.S    retErrOdd
  3823. CheckOddROM
  3824.         AND.L    Lo3Bytes,D0    ;mask off high byte
  3825.         BEQ.S    retErrZero
  3826. CheckROM.
  3827.         CMP.L    #$400000,D0
  3828.         BLO.S    retErrAddress    ;too low
  3829.  
  3830.         CMP.L    #$410000,D0
  3831.         BHS.S    retErrAddress    ;too high
  3832.  
  3833.         BRA    retOK
  3834.  
  3835. CheckAddress
  3836.         BSR    CheckRAM
  3837.         BPL.S    @1
  3838.         BSR.S    CheckROM.
  3839. @1
  3840.         RTS
  3841.  
  3842. CheckOddAddress
  3843.         BSR    CheckOddRAM
  3844.         BPL.S    @1
  3845.         BSR    CheckROM.
  3846. @1
  3847.         RTS
  3848.  
  3849. CheckString
  3850.         BSR.S    CheckOddAddress
  3851.         BMI    retErrString
  3852.         MOVE.L    D0,A0
  3853.         ADD.B    (A0),D0
  3854.         BSR.S    CheckOddAddress
  3855.         BMI    retErrStringLength
  3856.         RTS
  3857.  
  3858.         ErrText    String,string
  3859.         ErrText    StringLength,string length
  3860.  
  3861. CheckJT
  3862.         BSR    CheckRAM
  3863.         BMI.S    retErrJT
  3864.  
  3865.         CMP.L    BufPtr,D0
  3866.         BHS.S    retErrJT
  3867.         SUB.L    CurrentA5,D0
  3868.         BLO.S    retErrJT
  3869.         MOVEQ    #0,D1
  3870.         MOVE.W    CurJTOffset,D1
  3871.         SUB.L    D1,D0
  3872.         BLO.S    retErrJT
  3873.  
  3874.         AND.B    #3,D0
  3875.         SUBQ.B    #2,D0
  3876.         BNE.S    retErrJT
  3877.  
  3878.         BRA    retOK
  3879.  
  3880.         ErrTExt    JT,jump table
  3881.  
  3882. CheckZone
  3883.  
  3884. ;Given a heap zone address in D0, this checks to see that D0 is a valid
  3885. ;heap zone pointer.
  3886. ;It trashes register D0.  A1 is set to point to the zone header.
  3887.  
  3888.         BSR    CheckRAM
  3889.         BMI.S    retErrZonePtr
  3890.  
  3891.         MOVE.L    D0,A1        ;check fields of this heap
  3892.  
  3893.         ADD.L    #heapData,D0    ;point to the first byte of the heap
  3894.  
  3895.         CMP.L    bkLim(A1),D0    ;get the top of the heap
  3896.         BHS.S    retErrZone    ;if the header is too high, it is screwed up
  3897.  
  3898.         MOVE.L    bkLim(A1),D0
  3899.         BSR    CheckRAM
  3900.         BMI.S    retErrZone
  3901.  
  3902.         RTS
  3903.  
  3904.         ErrText    ZonePtr,THz
  3905.         ErrText    Zone,Zone
  3906.  
  3907. CheckBlock
  3908.  
  3909. ;Given a heap zone address in D0 and a block pointer in A0, this checks
  3910. ;to see that D0 is a valid heap zone pointer and that A0 falls within
  3911. ;the zone.
  3912. ;It trashes registers A1 and D0.
  3913.  
  3914.         CMP.L    D0,A0        ;compare with the header
  3915.         BLO    retErr
  3916.  
  3917.         BSR.S    CheckZone
  3918.         BMI    retErr
  3919.  
  3920.         CMP.L    bkLim(A1),A0    ;compare with the top of the heap
  3921.         BHS    retErr
  3922.  
  3923.         BRA    retOK
  3924.  
  3925. CheckPtr
  3926.  
  3927. ;Given an address in D0, this checks to see if it is a valid pointer.
  3928. ;It trashes registers D0, A0 and A1.
  3929.  
  3930.         BSR    CheckRAM
  3931.         BMI.S    retErrPtr    ;check if pointer is good at all
  3932.  
  3933.         MOVE.L    D0,A0        ;look at block more closely
  3934.  
  3935.         MOVE.B    tagBC-blkData(A0),D0
  3936.         AND.B    #tybkMask<<6,D0    ;get the block type
  3937.         CMP.B    #tybkNRel<<6,D0    ;is is a non-relocatable?
  3938.         BNE.S    retErrPtr
  3939.  
  3940.         MOVE.L    handle-blkData(A0),D0
  3941.         BSR.S    CheckBlock    ;get a pointer to the heap zone
  3942.         BMI.S    retErrPtr
  3943.  
  3944.         RTS
  3945.  
  3946.         ErrText    Ptr,Ptr
  3947.  
  3948. CheckHandle
  3949.  
  3950. ;Given an address in D0, this checks to see if it is a valid handle.
  3951. ;It trashes registers D0, A0 and A1.
  3952.  
  3953.         BSR    CheckRAM
  3954.         BMI.S    retErrHandle
  3955.  
  3956.         MOVE.L    D0,A1        ;save the master pointer address for later
  3957.  
  3958.         MOVE.L    D0,A0
  3959.         MOVE.L    (A0),D0        ;deref handle
  3960.         BEQ    retOK        ;purged handle is OK (master pointer=0)
  3961.  
  3962.         BSR    CheckRAM
  3963.         BMI.S    retErrHandle    ;check if master pointer is valid
  3964.  
  3965.         MOVE.L    D0,A0        ;look at block more closely
  3966.  
  3967.         MOVE.B    tagBC-blkData(A0),D0
  3968.         AND.B    #tybkMask<<6,D0    ;get the block type
  3969.         CMP.B    #tybkRel<<6,D0    ;is is a relocatable?
  3970.         BNE.S    retErrHandle
  3971.  
  3972.         MOVE.L    A1,D0        ;get a pointer to the heap zone
  3973.         SUB.L    handle-blkData(A0),D0
  3974.         BSR.S    CheckBlock    ;by subtracting the relative handle
  3975.         BMI.S    retErrHandle    ;from the absolute handle and check it
  3976.  
  3977.         RTS
  3978.  
  3979.         ErrText    Handle,Handle
  3980.  
  3981. CheckFakeHandle
  3982.  
  3983. ;This is just like CheckHandle except the handle can be a "fake" one.
  3984.  
  3985.         BSR    CheckAddress
  3986.         BMI.S    retErrHandle
  3987.  
  3988.         MOVE.L    D0,A0
  3989.         MOVE.L    (A0),D0
  3990.         BEQ    retOK
  3991.         BSR    CheckAddress
  3992.         BMI.S    retErrHandle
  3993.  
  3994.         RTS
  3995.  
  3996. CheckFullHandle
  3997.  
  3998. ;This is just like CheckHandle except the handle cannot be empty.
  3999.  
  4000.         MOVE.L    D0,-(SP)
  4001.         BSR.S    CheckHandle
  4002.         MOVEA.L    (SP)+,A0
  4003.         BMI.S    retErrHandle
  4004.  
  4005.         MOVE.L    (A0),D0
  4006.         AND.L    Lo3Bytes,D0
  4007.         BEQ.S    retErrEmptyHandle
  4008.  
  4009.         BRA    retOK
  4010.  
  4011.         ErrText    EmptyHandle,empty Handle
  4012.  
  4013. CheckFakeFullHandle
  4014.  
  4015. ;This is just like CheckFullHandle except the handle can be a "fake" one.
  4016.  
  4017.         BSR    CheckAddress
  4018.         BMI    retErrHandle
  4019.  
  4020.         MOVE.L    D0,A0
  4021.         MOVE.L    (A0),D0
  4022.         BSR    CheckAddress
  4023.         BMI    retErrHandle
  4024.  
  4025.         RTS
  4026.  
  4027. CheckRect
  4028.  
  4029. ;Given a pointer to a rectangle in D0, it checks that it is sensible.
  4030. ;It trashes A0 and returns the right-left value in D0 if it is successful.
  4031.  
  4032.         BSR    CheckAddress
  4033.         BMI.S    retErrRectPtr
  4034. CheckRect.
  4035.         MOVE.L    D0,A0
  4036.  
  4037.         MOVE.W    bottom(A0),D0
  4038.         SUB.W    top(A0),D0
  4039.         BLT.S    retErrRect
  4040.  
  4041.         MOVE.W    right(A0),D0
  4042.         SUB.W    left(A0),D0
  4043.         BLT.S    retErrRect
  4044.  
  4045.         BRA    retOK
  4046.  
  4047.         ErrText    RectPtr,^Rect
  4048.         ErrText    Rect,Rect
  4049.  
  4050. CheckBitMap
  4051.  
  4052. ;Given a bit map pointer in D0, this checks that it is a valid bit map.
  4053.  
  4054.         BSR    CheckAddress
  4055.         BMI.S    retErrBitMapPtr
  4056. CheckBitMap.
  4057.         MOVE.L    D0,A1
  4058.  
  4059.         MOVE.L    baseAddr(A1),D0
  4060.         BSR    CheckAddress
  4061.         BMI.S    retErrBaseAddr
  4062.  
  4063.         MOVE.L    A1,D0
  4064.         ADD.L    #bounds,D0
  4065.         BSR    CheckRect.
  4066.         BMI.S    retErrBounds
  4067.  
  4068.         MOVE.W    rowBytes(A1),D1
  4069.         BTST    #0,D1
  4070.         BNE    retErrRowBytes
  4071.  
  4072.         MOVE.W    bounds+bottom(A1),D0
  4073.         SUB.W    bounds+top(A1),D0
  4074.         MULU    D1,D0        ;calculate the size of this bitmap
  4075.         AND.L    #$FFFF,D0    ;mask off the low word
  4076.         ADD.L    baseAddr(A1),D0    ;calculate the last address of this bitmap
  4077.         BSR    CheckAddress
  4078.         BMI.S    retErrBitMap
  4079.  
  4080.         RTS
  4081.  
  4082.         ErrText    BitMapPtr,^BitMap
  4083.         ErrText    BitMap,BitMap
  4084.         ErrText    BaseAddr,baseAddr
  4085.         ErrText    Bounds,bounds
  4086.         ErrText    RowBytes,rowBytes
  4087.  
  4088. CheckCursor
  4089.  
  4090. ;Given a cursor pointer in D0, this checks the hot spot.
  4091.  
  4092.         BSR    CheckAddress
  4093.         BMI.S    retErrCursorPtr
  4094. CheckCursor.
  4095.         MOVE.L    D0,A0        ;point to that hot spot
  4096.         MOVE.W    hotSpot+h(A0),D0
  4097.         CMP.W    #16,D0
  4098.         BHI.S    retErrHotSpot
  4099.         MOVE.W    hotSpot+v(A0),D0
  4100.         CMP.W    #16,D0
  4101.         BHI.S    retErrHotSpot
  4102.  
  4103.         BRA    retOK
  4104.  
  4105.         ErrText    CursorPtr,^Cursor
  4106.         ErrText    HotSpot,hotSpot
  4107.  
  4108. CheckPPR
  4109.  
  4110. ;Given an address in D0, this checks if it is a good Region or Picture
  4111. ;or Polygon.
  4112. ;It trashes A0, A1, D0 and D1.
  4113.  
  4114.         MOVE.L    D0,D1
  4115.  
  4116.         BSR    CheckFullHandle
  4117.         BMI.S    @1
  4118.  
  4119.         MOVE.L    D1,A0
  4120.         MOVE.L    (A0),A0
  4121.         MOVE.W    (A0)+,D0    ;get the PPR length
  4122.  
  4123.         CMP.W    #10,D0
  4124.         BLT    retErr        ;good lengths are >= 10
  4125.  
  4126.         MOVE.L    A0,D0        ;get the PPR pointer
  4127.         BSR    CheckRect.
  4128. @1
  4129.         RTS
  4130.  
  4131. CheckPict
  4132.         BSR.S    CheckPPR
  4133.         BMI.S    retErrPict
  4134.         RTS
  4135.  
  4136.         ErrText    Pict,PicHandle
  4137.  
  4138. CheckPoly
  4139.         BSR.S    CheckPPR
  4140.         BMI.S    retErrPoly
  4141.         RTS
  4142.  
  4143.         ErrText    Poly,PolyHandle
  4144.  
  4145. CheckRgn
  4146.         BSR.S    CheckPPR
  4147.         BMI.S    retErrRgn
  4148.         RTS
  4149.  
  4150.         ErrText    Rgn,RgnHandle
  4151.  
  4152. CheckPort
  4153.  
  4154. ;Given a grafPort in D0, this checks just about every thing that you
  4155. ;can check.
  4156.  
  4157.         BSR    CheckRAM
  4158.         BMI.S    retErrPort
  4159. CheckPort.
  4160.         MOVE.L    D0,A2        ;point to the port
  4161.  
  4162.         ADD.L    #portBits,D0    ;point to the bitMap
  4163.         BSR    CheckBitMap.
  4164.         BMI    @3
  4165.  
  4166.         MOVE.L    A2,D0
  4167.         ADD.L    #portRect,D0    ;point to the rectangle
  4168.         BSR    CheckRect.
  4169.         BMI.S    retErrPortRect
  4170.  
  4171.         MOVE.L    visRgn(A2),D0    ;check this region
  4172.         BSR    CheckRgn
  4173.         BMI.S    retErrVisRgn
  4174.  
  4175.         MOVE.L    clipRgn(A2),D0    ;check this region
  4176.         BSR    CheckRgn
  4177.         BMI.S    retErrClipRgn
  4178.  
  4179.         MOVE.L    grafProcs(A2),D0
  4180.         BEQ.S    @2
  4181.         BSR    CheckAddress
  4182.         BMI.S    retErrGrafProcs
  4183.  
  4184.         MOVE.L    D0,A0
  4185.  
  4186.         MOVEQ    #13-1,D1
  4187. @1
  4188.         MOVE.L    (A0)+,D0
  4189.         BSR    CheckAddress
  4190.         BMI.S    retErrGrafProcs
  4191.         DBRA    D1,@1
  4192. @2
  4193.         BRA    retOK
  4194. @3
  4195.         RTS
  4196.  
  4197.         ErrText    Port,GrafPtr
  4198.         ErrText    PortRect,portRect
  4199.         ErrText    VisRgn,visRgn
  4200.         ErrText    ClipRgn,clipRgn
  4201.         ErrText    GrafProcs,grafProcs
  4202.  
  4203. CheckWindow
  4204.  
  4205.         BSR    CheckAddress
  4206.         BMI    retErrWindow
  4207. CheckWindow.
  4208.         BSR    CheckPort.
  4209.         BMI    @4
  4210.  
  4211.         MOVE.L    structRgn(A2),D0    ;check this region
  4212.         BSR    CheckRgn
  4213.         BMI    retErrStructRgn
  4214.  
  4215.         MOVE.L    contRgn(A2),D0        ;check this region
  4216.         BSR    CheckRgn
  4217.         BMI    retErrContRgn
  4218.  
  4219.         MOVE.L    updateRgn(A2),D0    ;check this region
  4220.         BSR    CheckRgn
  4221.         BMI    retErrUpdateRgn
  4222.  
  4223.         MOVE.L    windowDef(A2),D0    ;check the defProc
  4224.         BSR    CheckFakeHandle
  4225.         BMI    retErrDefProc
  4226.  
  4227.         MOVE.L    wTitleHandle(A2),D0    ;check the title
  4228.         BEQ.S    @1
  4229.         BSR    CheckFullHandle
  4230.         BMI    retErrWTitle
  4231. @1
  4232.         MOVE.L    wControlList(A2),D0    ;check the control list
  4233.         BEQ.S    @2
  4234.         BSR    CheckFullHandle
  4235.         BMI    retErrControlList
  4236. @2
  4237.         MOVE.L    nextWindow(A2),D0    ;check the next window
  4238.         BEQ.S    @3
  4239.         BSR    CheckRAM
  4240.         BMI    retErrNextWindow
  4241. @3
  4242.         MOVE.L    windowPic(A2),D0    ;check the picture handle
  4243.         BEQ.S    @4
  4244.         BSR    CheckFullHandle
  4245.         BMI    retErrWindowPic
  4246. @4
  4247.         RTS
  4248.  
  4249.         ErrText    Window,WindowPtr
  4250.         ErrText    StructRgn,strucRgn
  4251.         ErrText    ContRgn,contRgn
  4252.         ErrText    UpdateRgn,updateRgn
  4253.         ErrText    WTitle,titleHandle
  4254.         ErrText    ControlList,controlList
  4255.         ErrText    NextWindow,nextWindow
  4256.         ErrText    WindowPic,windowPic
  4257.  
  4258. CheckBehind
  4259.  
  4260.         TST.L    D0
  4261.         BEQ    retOK
  4262.         CMP.L    MinusOne,D0        ;-1 is also OK
  4263.         BEQ    retOK
  4264.  
  4265.         BSR    CheckWindow
  4266.  
  4267.         RTS
  4268.  
  4269. CheckControl
  4270.  
  4271.         MOVE.L    D0,A2
  4272.  
  4273.         BSR    CheckFullHandle
  4274.         BMI    retErrControl
  4275. CheckControl.
  4276.         MOVE.L    (A2),D0
  4277.         ADD.L    #contrlRect,D0        ;point to the rectangle
  4278.         BSR    CheckRect.
  4279.         BMI    retErrContrlRect
  4280.  
  4281.         MOVE.L    (A2),A2
  4282.  
  4283.         MOVE.L    nextControl(A2),D0    ;check the nextControl
  4284.         BEQ.S    @1
  4285.         BSR    CheckFullHandle
  4286.         BMI    retErrNextControl
  4287. @1
  4288.         MOVE.L    contrlDefHandle(A2),D0    ;check the defProc
  4289.         BSR    CheckFakeHandle
  4290.         BMI    retErrDefProc
  4291.  
  4292.         MOVE.L    contrlAction(A2),D0    ;check the actionProc
  4293.         BEQ.S    @2
  4294.         CMP.L    MinusOne,D0        ;-1 is ok, too
  4295.         BEQ.S    @2
  4296.         BSR    CheckAddress
  4297.         BMI.S    retErrAction
  4298. @2
  4299.         MOVE.L    contrlOwner(A2),D0    ;check the owner
  4300.         BSR    CheckRAM
  4301.         BMI.S    retErrContrlOwner
  4302.  
  4303.         RTS
  4304.  
  4305.         ErrText    Control,ControlHandle
  4306.         ErrText    ContrlRect,contrlRect
  4307.         ErrText    NextControl,nextControl
  4308.         ErrText    Action,actionProc
  4309.         ErrText    ContrlOwner,contrlOwner
  4310.  
  4311. CheckMenu
  4312.  
  4313.         MOVE.L    D0,A2
  4314.  
  4315.         BSR    CheckFullHandle
  4316.         BMI.S    retErrMenu
  4317.  
  4318.         MOVE.L    (A2),A2
  4319.  
  4320.         MOVE.L    menuDefHandle(A2),D0    ;check the menu defProc
  4321.         BSR    CheckFakeHandle
  4322.         BMI.S    retErrDefProc
  4323.  
  4324.         RTS
  4325.  
  4326.         ErrText    Menu,MenuHandle
  4327.         ErrText    DefProc,defProc handle
  4328.  
  4329. CheckTERec
  4330.  
  4331.         MOVE.L    D0,A2
  4332.  
  4333.         BSR    CheckFullHandle
  4334.         BMI.S    retErrTE
  4335.  
  4336.         MOVE.L    (A2),D0
  4337.         ADD.L    #teDestRect,D0    ;point to the rectangle
  4338.         BSR    CheckRect.
  4339.         BMI    retErrDestRect
  4340.  
  4341.         MOVE.L    (A2),D0
  4342.         ADD.L    #teViewRect,D0    ;point to the rectangle
  4343.         BSR    CheckRect.
  4344.         BMI    retErrViewRect
  4345.  
  4346.         MOVE.L    (A2),A2
  4347.  
  4348.         MOVE.L    teTextH(A2),D0    ;check the text
  4349.         BSR    CheckFullHandle
  4350.         BMI    retErrTextH
  4351.  
  4352.         MOVE.L    teWordBreak(A2),D0
  4353.         BEQ.S    @1
  4354.         BSR    CheckAddress
  4355.         BMI    retErrWordBreak
  4356. @1
  4357.         MOVE.L    teClikProc(A2),D0
  4358.         BEQ.S    @2
  4359.         BSR    CheckAddress
  4360.         BMI    retErrClikProc
  4361. @2
  4362.         MOVE.L    teHiHook(A2),D0
  4363.         BEQ.S    @3
  4364.         BSR    CheckAddress
  4365.         BMI    retErrHiHook
  4366. @3
  4367.         MOVE.L    teCarHook(A2),D0
  4368.         BEQ.S    @4
  4369.         BSR    CheckAddress
  4370.         BMI    retErrCarHook
  4371. @4
  4372.         MOVE.L    teGrafPort(A2),D0
  4373.         BSR    CheckRAM
  4374.         BMI    retErrInPort
  4375.  
  4376.         RTS
  4377.  
  4378.         ErrText    TE,TEHandle
  4379.         ErrText    DestRect,destRect
  4380.         ErrText    ViewRect,viewRect
  4381.         ErrText    TextH,text handle
  4382.         ErrText    WordBreak,wordBreak
  4383.         ErrText    ClikProc,clikLoop
  4384.         ErrText    HiHook,highHook
  4385.         ErrText    CarHook,caretHook
  4386.         ErrText InPort,TE GrafPtr
  4387.  
  4388. CheckDialog
  4389.  
  4390.         BSR    CheckAddress
  4391.         BMI.S    retErrDialog
  4392. CheckDialog.
  4393.         BSR    CheckWindow.
  4394.         BMI    @1
  4395.  
  4396.         MOVE.L    items(A2),D0
  4397.         BSR    CheckFullHandle
  4398.         BMI.S    retErrItemList
  4399.  
  4400.         MOVE.L    teHandle(A2),D0
  4401.         BEQ.S    @1
  4402.         BSR    CheckFullHandle
  4403.         BMI.S    retErrEditText
  4404. @1
  4405.         RTS
  4406.  
  4407.         ErrText    Dialog,DialogPtr
  4408.         ErrText    ItemList,item list
  4409.         ErrText    EditText,editText item
  4410.  
  4411. ;+------------------------------------------------------------------+
  4412. ;| The following code is for actual use of the Check... code above. |
  4413. ;+------------------------------------------------------------------+
  4414.  
  4415. ROMA0
  4416.         MOVE.L    RegA0,D0    ;get ROM location in register
  4417. .CheckROM    BRA    CheckROM
  4418.  
  4419. RAMA0
  4420.         MOVE.L    RegA0,D0    ;get RAM location in register
  4421. .CheckRAM    BRA    CheckRAM
  4422.  
  4423. RAMA1
  4424.         MOVE.L    RegA1,D0    ;get RAM location in register
  4425.         BRA.S    .CheckRAM
  4426.  
  4427. RAM0
  4428.         MOVE.L    Stack0,D0    ;get RAM location in register
  4429.         BRA.S    .CheckRAM
  4430.  
  4431. RAM2
  4432.         MOVE.L    Stack2,D0    ;get RAM location in register
  4433.         BRA.S    .CheckRAM
  4434.  
  4435. RAM4
  4436.         MOVE.L    Stack4,D0    ;get RAM location in register
  4437.         BRA.S    .CheckRAM
  4438.  
  4439. RAM6
  4440.         MOVE.L    Stack6,D0    ;get RAM location in register
  4441.         BRA.S    .CheckRAM
  4442.  
  4443. RAM8
  4444.         MOVE.L    Stack8,D0    ;get RAM location in register
  4445.         BRA.S    .CheckRAM
  4446.  
  4447. RAM22
  4448.         MOVE.L    Stack22,D0    ;get RAM location in register
  4449.         BRA.S    .CheckRAM
  4450.  
  4451. OddRAMA0
  4452.         MOVE.L    RegA0,D0    ;get RAM location in register
  4453. .CheckOddRAM    BRA    CheckOddRAM
  4454.  
  4455. OddRAM4
  4456.         MOVE.L    Stack4,D0    ;get RAM location in register
  4457.         BRA.S    .CheckOddRAM
  4458.  
  4459. AddressA0
  4460.         MOVE.L    RegA0,D0    ;get address in register
  4461. .CheckAddress    BRA    CheckAddress
  4462.  
  4463. AddressA1
  4464.         MOVE.L    RegA1,D0    ;get address in register
  4465.         BRA.S    .CheckAddress
  4466.  
  4467. Address0
  4468.         MOVE.L    Stack0,D0    ;get address in register
  4469.         BRA.S    .CheckAddress
  4470.  
  4471. Address4
  4472.         MOVE.L    Stack4,D0    ;get address in register
  4473.         BRA.S    .CheckAddress
  4474.  
  4475. Address8
  4476.         MOVE.L    Stack8,D0    ;get address in register
  4477.         BRA.S    .CheckAddress
  4478.  
  4479. Address10
  4480.         MOVE.L    Stack10,D0    ;get address in register
  4481.         BRA.S    .CheckAddress
  4482.  
  4483. Address16
  4484.         MOVE.L    Stack16,D0    ;get address in register
  4485.         BRA.S    .CheckAddress
  4486.  
  4487. OddAddressA0
  4488.         MOVE.L    RegA0,D0    ;get address in register
  4489. .CheckOddAddress
  4490.         BRA    CheckOddAddress
  4491.  
  4492. OddAddress0
  4493.         MOVE.L    Stack0,D0    ;get address in register
  4494.         BRA.S    .CheckOddAddress
  4495.  
  4496. OddAddress4
  4497.         MOVE.L    Stack4,D0    ;get address in register
  4498.         BRA.S    .CheckOddAddress
  4499.  
  4500. OddAddress8
  4501.         MOVE.L    Stack8,D0    ;get address in register
  4502.         BRA.S    .CheckOddAddress
  4503.  
  4504. OddAddress12
  4505.         MOVE.L    Stack12,D0    ;get address in register
  4506.         BRA.S    .CheckOddAddress
  4507.  
  4508. StringA0
  4509.         MOVE.L    RegA0,D0    ;get string in register
  4510. .CheckString    BRA    CheckString
  4511.  
  4512. String0
  4513.         MOVE.L    Stack0,D0    ;get string in register
  4514.         BRA.S    .CheckString
  4515.  
  4516. String2
  4517.         MOVE.L    Stack2,D0    ;get string in register
  4518.         BRA.S    .CheckString
  4519.  
  4520. String4
  4521.         MOVE.L    Stack4,D0    ;get string in register
  4522.         BRA.S    .CheckString
  4523.  
  4524. String10
  4525.         MOVE.L    Stack10,D0    ;get string in register
  4526.         BRA.S    .CheckString
  4527.  
  4528. String14
  4529.         MOVE.L    Stack14,D0    ;get string in register
  4530.         BRA.S    .CheckString
  4531.  
  4532. String16
  4533.         MOVE.L    Stack16,D0    ;get string in register
  4534.         BRA.S    .CheckString
  4535.  
  4536. String18
  4537.         MOVE.L    Stack18,D0    ;get string in register
  4538.         BRA.S    .CheckString
  4539.  
  4540. String20
  4541.         MOVE.L    Stack20,D0    ;get string in register
  4542.         BRA.S    .CheckString
  4543.  
  4544. String26
  4545.         MOVE.L    Stack26,D0    ;get string in register
  4546.         BRA.S    .CheckString
  4547.  
  4548. JTPC
  4549.         MOVE.L    RegPC,D0
  4550. .CheckJT    BRA    CheckJT
  4551.  
  4552. JT0
  4553.         MOVE.L    Stack0,D0
  4554.         BRA.S    .CheckJT
  4555.  
  4556. ZoneA0
  4557.         MOVE.L    RegA0,D0
  4558. .CheckZone    BRA    CheckZone
  4559.  
  4560. PtrA0
  4561.         MOVE.L    RegA0,D0    ;get handle in register
  4562. .CheckPtr    BRA    CheckPtr
  4563.  
  4564. Ptr0
  4565.         MOVE.L    Stack0,D0    ;get handle in register
  4566.         BRA.S    .CheckPtr
  4567.  
  4568. HandleA0
  4569.         MOVE.L    RegA0,D0    ;get handle in register
  4570. .CheckHandle    BRA    CheckHandle
  4571.  
  4572. Handle0
  4573.         MOVE.L    Stack0,D0    ;get handle in register
  4574.         BRA.S    .CheckHandle
  4575.  
  4576. Handle4
  4577.         MOVE.L    Stack4,D0    ;get handle in register
  4578.         BRA.S    .CheckHandle
  4579.  
  4580. FullHandleA0
  4581.         MOVE.L    RegA0,D0    ;get handle in register
  4582. .CheckFullHandle
  4583.         BRA    CheckFullHandle
  4584.  
  4585. FullHandleA1
  4586.         MOVE.L    RegA1,D0    ;get handle in register
  4587.         BRA.S    .CheckFullHandle
  4588.  
  4589. FullHandle0
  4590.         MOVE.L    Stack0,D0    ;get handle in register
  4591.         BRA.S    .CheckFullHandle
  4592.  
  4593. FullHandle2
  4594.         MOVE.L    Stack2,D0    ;get handle in register
  4595.         BRA.S    .CheckFullHandle
  4596.  
  4597. FullHandle4
  4598.         MOVE.L    Stack4,D0    ;get handle in register
  4599.         BRA.S    .CheckFullHandle
  4600.  
  4601. FullHandle8
  4602.         MOVE.L    Stack8,D0    ;get handle in register
  4603.         BRA.S    .CheckFullHandle
  4604.  
  4605. FullHandle10
  4606.         MOVE.L    Stack10,D0    ;get handle in register
  4607.         BRA.S    .CheckFullHandle
  4608.  
  4609. FakeFullHandle0
  4610.         MOVE.L    Stack0,D0    ;get handle in register
  4611. .CheckFakeFullHandle
  4612.         BRA    CheckFakeFullHandle
  4613.  
  4614. Cursor0
  4615.         MOVE.L    Stack0,D0    ;get cursor location in register
  4616. .CheckCursor    BRA    CheckCursor
  4617.  
  4618. Rect0
  4619.         MOVE.L    Stack0,D0    ;get rectangle in register
  4620. .CheckRect    BRA    CheckRect
  4621.         RTS
  4622.  
  4623. Rect2
  4624.         MOVE.L    Stack2,D0    ;get rectangle in register
  4625.         BRA.S    .CheckRect
  4626.  
  4627. Rect4
  4628.         MOVE.L    Stack4,D0    ;get rectangle in register
  4629.         BRA.S    .CheckRect
  4630.  
  4631. Rect6
  4632.         MOVE.L    Stack6,D0    ;get rectangle in register
  4633.         BRA.S    .CheckRect
  4634.  
  4635. Rect8
  4636.         MOVE.L    Stack8,D0    ;get rectangle in register
  4637.         BRA.S    .CheckRect
  4638.  
  4639. Rect10
  4640.         MOVE.L    Stack10,D0    ;get rectangle in register
  4641.         BRA.S    .CheckRect
  4642.  
  4643. Rect18
  4644.         MOVE.L    Stack18,D0    ;get rectangle in register
  4645.         BRA.S    .CheckRect
  4646.  
  4647. Rect22
  4648.         MOVE.L    Stack22,D0    ;get rectangle in register
  4649.         BRA.S    .CheckRect
  4650.  
  4651. Rgn0
  4652.         MOVE.L    Stack0,D0    ;get region in register
  4653. .CheckRgn    BRA    CheckRgn
  4654.  
  4655. Rgn4
  4656.         MOVE.L    Stack4,D0    ;get region in register
  4657.         BRA.S    .CheckRgn
  4658.  
  4659. Rgn8
  4660.         MOVE.L    Stack8,D0    ;get region in register
  4661.         BRA.S    .CheckRgn
  4662.  
  4663. Rgn18
  4664.         MOVE.L    Stack18,D0    ;get region in register
  4665.         BRA.S    .CheckRgn
  4666.  
  4667. Poly0
  4668.         MOVE.L    Stack0,D0    ;get polygon in register
  4669. .CheckPoly    BRA    CheckPoly
  4670.  
  4671. Poly4
  4672.         MOVE.L    Stack4,D0    ;get polygon in register
  4673.         BRA.S    .CheckPoly
  4674.  
  4675. Poly8
  4676.         MOVE.L    Stack8,D0    ;get polygon in register
  4677.         BRA.S    .CheckPoly
  4678.  
  4679. Pict0
  4680.         MOVE.L    Stack0,D0    ;get picture in register
  4681. .CheckPict    BRA    CheckPict
  4682.  
  4683. Pict4
  4684.         MOVE.L    Stack4,D0    ;get picture in register
  4685.         BRA.S    .CheckPict
  4686.  
  4687. Port0
  4688.         MOVE.L    Stack0,D0    ;get port in register
  4689. .CheckPort    BRA    CheckPort
  4690.  
  4691. Window0
  4692.         MOVE.L    Stack0,D0    ;get window in register
  4693. .CheckWindow    BRA    CheckWindow
  4694.  
  4695. Window2
  4696.         MOVE.L    Stack2,D0    ;get window in register
  4697.         BRA.S    .CheckWindow
  4698.  
  4699. Window4
  4700.         MOVE.L    Stack4,D0    ;get window in register
  4701.         BRA.S    .CheckWindow
  4702.  
  4703. Window6
  4704.         MOVE.L    Stack6,D0    ;get window in register
  4705.         BRA.S    .CheckWindow
  4706.  
  4707. Window8
  4708.         MOVE.L    Stack8,D0    ;get window in register
  4709.         BRA.S    .CheckWindow
  4710.  
  4711. Window22
  4712.         MOVE.L    Stack22,D0    ;get window in register
  4713.         BRA.S    .CheckWindow
  4714.  
  4715. Behind0
  4716.         MOVE.L    Stack0,D0    ;check the behind field
  4717. .CheckBehind    BRA    CheckBehind
  4718.  
  4719. Behind6
  4720.         MOVE.L    Stack6,D0    ;check the behind field
  4721.         BRA.S    .CheckBehind
  4722.  
  4723. Behind10
  4724.         MOVE.L    Stack10,D0    ;check the behind field
  4725.         BRA.S    .CheckBehind
  4726.  
  4727. Dialog0
  4728.         MOVE.L    Stack0,D0    ;check the dialog
  4729. .CheckDialog    BRA    CheckDialog
  4730.  
  4731. Dialog6
  4732.         MOVE.L    Stack6,D0    ;check the dialog
  4733.         BRA.S    .CheckDialog
  4734.  
  4735. Dialog12
  4736.         MOVE.L    Stack12,D0    ;check the dialog
  4737.         BRA.S    .CheckDialog
  4738.  
  4739. Dialog14
  4740.         MOVE.L    Stack14,D0    ;check the dialog
  4741.         BRA.S    .CheckDialog
  4742.  
  4743. Menu0
  4744.         MOVE.L    Stack0,D0    ;get menu handle in register
  4745. .CheckMenu    BRA    CheckMenu
  4746.  
  4747. Menu2
  4748.         MOVE.L    Stack2,D0    ;get menu handle in register
  4749.         BRA.S    .CheckMenu
  4750.  
  4751. Menu4
  4752.         MOVE.L    Stack4,D0    ;get menu handle in register
  4753.         BRA.S    .CheckMenu
  4754.  
  4755. Menu6
  4756.         MOVE.L    Stack6,D0    ;get menu handle in register
  4757.         BRA.S    .CheckMenu
  4758.  
  4759. Control0
  4760.         MOVE.L    Stack0,D0    ;get control handle in register
  4761. .CheckControl    BRA    CheckControl
  4762.  
  4763. Control2
  4764.         MOVE.L    Stack2,D0    ;get control handle in register
  4765.         BRA.S    .CheckControl
  4766.  
  4767. Control4
  4768.         MOVE.L    Stack4,D0    ;get control handle in register
  4769.         BRA.S    .CheckControl
  4770.  
  4771. Control8
  4772.         MOVE.L    Stack8,D0    ;get control handle in register
  4773.         BRA.S    .CheckControl
  4774.  
  4775. Control14
  4776.         MOVE.L    Stack14,D0    ;get control handle in register
  4777.         BRA.S    .CheckControl
  4778.  
  4779. ProcA0
  4780.         MOVE.L    RegA0,D0    ;get the proc into a register
  4781. .CheckProc    BEQ    retOK
  4782.         BRA    CheckAddress
  4783.  
  4784. Proc0
  4785.         MOVE.L    Stack0,D0    ;get the proc into a register
  4786.         BRA.S    .CheckProc
  4787.  
  4788. Proc4
  4789.         MOVE.L    Stack4,D0    ;get the proc into a register
  4790.         BRA.S    .CheckProc
  4791.  
  4792. TERec0
  4793.         MOVE.L    Stack0,D0    ;get TERec handle in register
  4794. .CheckTERec    BRA    CheckTERec
  4795.  
  4796. BitMap0
  4797.         MOVE.L    Stack0,D0    ;get bitmap pointer in register
  4798. .CheckBitMap    BRA    CheckBitMap
  4799.  
  4800. BitMap14
  4801.         MOVE.L    Stack14,D0    ;get bitmap pointer in register
  4802.         BRA.S    .CheckBitMap
  4803.  
  4804. BitMap18
  4805.         MOVE.L    Stack18,D0    ;get bitmap pointer in register
  4806.         BRA.S    .CheckBitMap
  4807.  
  4808. ;+-----------------------------------------------+
  4809. ;| These are the trap-specific checking routines |
  4810. ;+-----------------------------------------------+
  4811.  
  4812. SetTrapAddress
  4813.         BSR    ROMA0        ;if it is ROM, it's fine
  4814.         BPL.S    @1
  4815.  
  4816.         MOVE.L    D0,A0
  4817.         MOVE.L    SysZone,D0    ;check if this routine is in the system heap
  4818.         BSR    CheckBlock
  4819.         BMI.S    retErrSysZone
  4820. @1
  4821.         RTS
  4822.  
  4823.         ErrText    SysZone,not in SysZone
  4824.  
  4825. EqualRect
  4826. Address4Address0
  4827.         BSR    Address4
  4828.         BMI.S    @1
  4829.  
  4830.         BSR    Address0
  4831. @1
  4832.         RTS
  4833.  
  4834. TENew
  4835. Rect4Rect0
  4836.         BSR    Rect4        ;check one of the rectangles
  4837.         BMI.S    @1
  4838.  
  4839.         BSR    Rect0        ;check the other rectangle
  4840. @1
  4841.         RTS
  4842.  
  4843. ScalePt
  4844. MapPt
  4845.         BSR    RAM8        ;check the ram address
  4846.         BMI.S    @1
  4847.  
  4848.         BSR    Rect4Rect0    ;check the two rectangles
  4849. @1
  4850.         RTS
  4851.  
  4852. FillRect
  4853. FillOval
  4854. Rect4RAM0
  4855.         BSR    Rect4        ;check the rectangle
  4856.         BMI.S    @1
  4857.  
  4858.         BSR    RAM0        ;check the other pointer
  4859. @1
  4860.         RTS
  4861.  
  4862. FillRoundRect
  4863. FillArc
  4864. PtToAngle
  4865.         BSR    Rect8        ;check the rectangle
  4866.         BMI.S    @1
  4867.  
  4868.         BSR    RAM0        ;check the other pointer
  4869. @1
  4870.         RTS
  4871.  
  4872. SectRect
  4873. UnionRect
  4874.         BSR    Address8
  4875.         BMI.S    @1
  4876.  
  4877.         BSR    Address4
  4878.         BMI.S    @1
  4879.  
  4880.         BSR    RAM0        ;check the destination
  4881. @1
  4882.         RTS
  4883.  
  4884. MapRect
  4885.         BSR    Address8    ;check the destination "rectangle"
  4886.         BMI.S    @1
  4887.  
  4888.         BSR    Rect4Rect0    ;check the mapping rectangles
  4889. @1
  4890.         RTS
  4891.  
  4892. FillPoly
  4893.         BSR    Poly4        ;check the polygon
  4894.         BMI.S    @1
  4895.  
  4896.         BSR    RAM0        ;check the other pointer
  4897. @1
  4898.         RTS
  4899.  
  4900. FillRgn
  4901.         BSR    Rgn4        ;check the region
  4902.         BMI.S    @1
  4903.  
  4904.         BSR    RAM0        ;check the other pointer
  4905. @1
  4906.         RTS
  4907.  
  4908. CopyRgn
  4909. EqualRgn
  4910. Rgn4Rgn0
  4911.         BSR    Rgn4        ;check one of the regions
  4912.         BMI.S    @1
  4913.  
  4914.         BSR    Rgn0        ;check the other region
  4915. @1
  4916.         RTS
  4917.  
  4918. SectRgn
  4919. UnionRgn
  4920. DiffRgn
  4921. XorRgn
  4922.         BSR    Rgn8        ;check one of the regions
  4923.         BMI.S    @1
  4924.  
  4925.         BSR    Rgn4Rgn0    ;check the other two
  4926. @1
  4927.         RTS
  4928.  
  4929. MapRgn
  4930.         BSR    Rgn8        ;check the region
  4931.         BMI.S    @1
  4932.  
  4933.         BSR    Rect4Rect0    ;check the two rectangles
  4934. @1
  4935.         RTS
  4936.  
  4937. MapPoly
  4938.         BSR    Poly8        ;check the polygon
  4939.         BMI.S    @1
  4940.  
  4941.         BSR    Rect4Rect0    ;check the two rectangles
  4942. @1
  4943.         RTS
  4944.  
  4945. RectRgn
  4946.         BSR    Rgn4        ;check if the destination is a region
  4947.         BMI.S    @1
  4948.  
  4949.         BSR    Address0    ;check the source
  4950. @1
  4951.         RTS
  4952.  
  4953. RectInRgn
  4954.         BSR    Address4    ;check if the "rectangle"
  4955.         BMI.S    @1
  4956.  
  4957.         BSR    Rgn0        ;check if this is a region
  4958. @1
  4959.         RTS
  4960.  
  4961. DrawPicture
  4962.         BSR    Pict4        ;check if the picture is a picture
  4963.         BMI.S    @1
  4964.  
  4965.         BSR    Rect0        ;check if the rect is a rectangle
  4966. @1
  4967.         RTS
  4968.  
  4969. Rect10Rect6
  4970.         BSR    Rect10
  4971.         BMI.S    @1
  4972.  
  4973.         BSR    Rect6
  4974. @1
  4975.         RTS
  4976.  
  4977. StdBits
  4978. StdBits.
  4979.         BSR    BitMap14
  4980.         BMI.S    @1
  4981.  
  4982.         BSR    Rect10Rect6
  4983.         BMI.S    @1
  4984.  
  4985.         MOVE.L    Stack0,D0    ;get the region into a register
  4986.         BEQ    retOK
  4987.         BSR    CheckRgn
  4988. @1
  4989.         RTS
  4990.  
  4991. CopyBits
  4992.         BSR    BitMap18
  4993.         BMI.S    @1
  4994.  
  4995.         BSR.S    StdBits.    ;check the rest of the parameters
  4996. @1
  4997.         RTS
  4998.  
  4999. DragGrayRgn
  5000. DragTheRgn
  5001.         BSR    Rgn18
  5002.         BMI.S    @1
  5003.  
  5004.         BSR    Rect10Rect6
  5005.         BMI.S    @1
  5006.  
  5007.         BSR    Proc0        ;check the action proc
  5008. @1
  5009.         RTS
  5010.  
  5011. CalcVis
  5012. SystemClick
  5013. ClipAbove
  5014.         MOVE.L    Stack0,D0    ;check the window parameter
  5015.         BEQ    retOK
  5016.         BSR    CheckWindow
  5017.  
  5018.         RTS
  5019.  
  5020. CalcVisBehind
  5021. PaintOne
  5022. PaintBehind
  5023.         MOVE.L    Stack4,D0    ;check the window parameter
  5024.         BEQ.S    @1
  5025.         BSR    CheckWindow
  5026.         BMI.S    @2
  5027. @1
  5028.         BSR    Rgn0        ;check the region parameter
  5029. @2
  5030.         RTS
  5031.  
  5032. NewWindow
  5033.         MOVE.L    Stack22,D0    ;check the window storage
  5034.         BEQ.S    @1
  5035.         BSR    CheckRAM
  5036.         BMI.S    @2
  5037. @1
  5038.         BSR    Rect18        ;check the window rectangle
  5039.         BMI.S    @2
  5040.  
  5041.         BSR    String14    ;check the window title
  5042.         BMI.S    @2
  5043.  
  5044.         BSR    Behind6        ;check the behind field
  5045. @2
  5046.         RTS
  5047.  
  5048. DisposeWindow
  5049.         BSR    Window0        ;check the window
  5050.         BMI.S    @1
  5051.  
  5052.         BSR    Ptr0
  5053. @1
  5054.         RTS
  5055.  
  5056. NewDialog
  5057.         MOVE.L    Stack26,D0    ;check the dialog storage
  5058.         BEQ.S    @1
  5059.         BSR    CheckRAM
  5060.         BMI.S    @2
  5061. @1
  5062.         BSR    Rect22        ;check the window rectangle
  5063.         BMI.S    @2
  5064.  
  5065.         BSR    String18    ;check the title
  5066.         BMI.S    @2
  5067.  
  5068.         BSR    Behind10    ;check the behind field
  5069.         BMI.S    @2
  5070.  
  5071.         MOVE.L    Stack0,D0    ;don't need an item handle just yet
  5072.         BEQ    retOK
  5073.         BSR    CheckFullHandle    ;check the items handle
  5074. @2
  5075.         RTS
  5076.  
  5077. DisposDialog
  5078.         BSR    Dialog0        ;check the dialog
  5079.         BMI.S    @1
  5080.  
  5081.         BSR    Ptr0
  5082. @1
  5083.         RTS
  5084.  
  5085. GetNewWindow
  5086. GetNewDialog
  5087.         MOVE.L    Stack4,D0    ;check the storage
  5088.         BEQ.S    @1
  5089.         BSR    CheckRAM
  5090.         BMI.S    @2
  5091. @1
  5092.         BSR    Behind0
  5093. @2
  5094.         RTS
  5095.  
  5096. GetWTitle
  5097. FindControl
  5098. Window4RAM0
  5099.         BSR    Window4        ;check the window
  5100.         BMI.S    @1
  5101.  
  5102.         BSR    RAM0        ;check the result place
  5103. @1
  5104.         RTS
  5105.  
  5106. SetWTitle
  5107.         BSR    Window4        ;check the window
  5108.         BMI.S    @1
  5109.  
  5110.         BSR    String0        ;check the new title
  5111. @1
  5112.         RTS
  5113.  
  5114. SendBehind
  5115.         BSR    Window4        ;check one window parameter
  5116.         BMI.S    @1
  5117.  
  5118.         MOVE.L    Stack0,D0
  5119.         BEQ    retOK
  5120.         BSR    CheckWindow    ;check the behind parameter
  5121. @1
  5122.         RTS
  5123.  
  5124. UpdateInit
  5125.         LEA    Updating,A0
  5126.         MOVE.L    (A0),D1
  5127.         MOVE.L    Stack0,D0
  5128.         RTS
  5129. BeginUpdate
  5130.         BSR.S    UpdateInit
  5131.         MOVE.L    D0,(A0)
  5132.         TST.L    D1
  5133.         BNE.S    retErrBadBeginUpdate
  5134.         BRA.S    Update
  5135. EndUpdate
  5136.         BSR.S    UpdateInit
  5137.         CLR.L    (A0)
  5138.         CMP.L    D1,D0
  5139.         BNE.S    retErrBadEndUpdate
  5140. Update
  5141.         BSR    CheckPort
  5142.         BMI.S    @1
  5143.  
  5144.         MOVE.L    updateRgn(A2),D0    ;check this region
  5145.         BSR    CheckRgn
  5146.         BMI    retErrUpdateRgn
  5147. @1
  5148.         RTS
  5149.  
  5150.         ErrText    BadBeginUpdate,no EndUpdate
  5151.         ErrText    BadEndUpdate,<> BeginUpdate
  5152.  
  5153. DragWindow
  5154. GrowWindow
  5155.         BSR    Window8        ;check the window
  5156.         BMI.S    @1
  5157.  
  5158.         BSR    Rect0        ;check the rectangle
  5159. @1
  5160.         RTS
  5161.  
  5162. GetItemIcon
  5163. GetItemStyle
  5164. GetItemMark
  5165. GetItem
  5166.         BSR    Menu6        ;check the menu
  5167.         BMI.S    @1
  5168.  
  5169.         BSR    RAM0        ;check the address
  5170. @1
  5171.         RTS
  5172.  
  5173. SetItem
  5174.         BSR    Menu6        ;check the menu
  5175.         BMI.S    @1
  5176.  
  5177.         BSR    String0        ;check the string
  5178. @1
  5179.         RTS
  5180.  
  5181. PlotIcon
  5182.         BSR    Rect4        ;check the rectangle
  5183.         BMI.S    @1
  5184.  
  5185.         BSR    FakeFullHandle0    ;check the handle
  5186. @1
  5187.         RTS
  5188.  
  5189. NewControl
  5190.         BSR    Window22    ;check the window
  5191.         BMI.S    @1
  5192.  
  5193.         BSR    Rect18        ;check the rectangle
  5194.         BMI.S    @1
  5195.  
  5196.         BSR    String14    ;check the title
  5197. @1
  5198.         RTS
  5199.  
  5200. GetCTitle
  5201.         BSR    Control4    ;check the control
  5202.         BMI.S    @1
  5203.  
  5204.         BSR    RAM0        ;check the address
  5205. @1
  5206.         RTS
  5207.  
  5208. SetCTitle
  5209.         BSR    FullHandle4    ;check the control
  5210.         BMI.S    @1
  5211.  
  5212.         BSR    String0
  5213. @1
  5214.         RTS
  5215.  
  5216. DragControl
  5217.         BSR    Control14    ;check the control
  5218.         BMI.S    @1
  5219.  
  5220.         BSR    Rect6        ;check the limitRect
  5221.         BMI.S    @1
  5222.  
  5223.         BSR    Rect2        ;check the slopRect
  5224. @1
  5225.         RTS
  5226.  
  5227. Dequeue
  5228. Enqueue
  5229.         BSR    RAMA0
  5230.         BMI.S    @1
  5231.         
  5232.         BSR    RAMA1
  5233. @1
  5234.         RTS
  5235.  
  5236. DialogSelect
  5237.         BSR    Address8    ;check the event
  5238.         BMI.S    DialogSelectRTS
  5239. RAM4RAM0
  5240.         BSR    RAM4        ;check one result
  5241.         BMI.S    DialogSelectRTS
  5242.  
  5243.         BSR    RAM0        ;check the other
  5244. DialogSelectRTS
  5245.         RTS
  5246.  
  5247. GetAppParms
  5248. RAM8RAM4RAM0
  5249.         BSR    RAM8        ;check another
  5250.         BMI.S    @1
  5251.  
  5252.         BSR.S    RAM4RAM0    ;check more
  5253. @1
  5254.         RTS
  5255.  
  5256. GetResInfo
  5257. GetResInfo.
  5258.         MOVE.L    Stack8,D0
  5259.         BEQ.S    @1
  5260.         BSR    CheckRAM
  5261.         BMI.S    @3
  5262. @1
  5263.         MOVE.L    Stack4,D0
  5264.         BEQ.S    @2
  5265.         BSR    CheckRAM
  5266.         BMI.S    @3
  5267. @2
  5268.         MOVE.L    Stack0,D0
  5269.         BEQ    retOK
  5270.         BSR    CheckRAM
  5271. @3
  5272.         RTS
  5273.  
  5274. GetDItem
  5275.         BSR    Dialog14    ;check the dialog first
  5276.         BMI.S    @1
  5277.  
  5278.         BSR.S    GetResInfo.    ;check the other parameters
  5279. @1
  5280.         RTS
  5281.  
  5282. SetDItem
  5283.         BSR    Dialog12    ;check the dialog first
  5284.         BMI.S    @1
  5285.  
  5286.         MOVE.W    Stack8,D0    ;check the item type we are setting
  5287.         AND.W    #$7F,D0        ;extract the type
  5288.         BEQ.S    @2        ;userItem (0) is a special case
  5289.         BSR    FullHandle4    ;check the item handle
  5290.         BMI.S    @1
  5291.         BRA.S    @3
  5292. @2
  5293.         MOVE.L    Stack4,D0
  5294.         BEQ.S    @3
  5295.         BSR    CheckAddress    ;check the userItem proc
  5296.         BMI.S    @1
  5297. @3
  5298.         BSR    Rect0        ;check the rectangle
  5299. @1
  5300.         RTS
  5301.  
  5302. ModalDialog
  5303.         BSR    Proc4        ;check the filterProc
  5304.         BMI.S    @1
  5305.  
  5306.         BSR    RAM0        ;check the result address
  5307. @1
  5308.         RTS
  5309.  
  5310. TEUpdate
  5311.         BSR    Rect4        ;check the update rect
  5312.         BMI.S    @1
  5313.  
  5314.         BSR    TERec0
  5315. @1
  5316.         RTS
  5317.  
  5318. PtrToHand
  5319.         BSR    OddAddressA0
  5320.         BMI.S    @1
  5321.  
  5322.         TST.B    RegD0
  5323.         BNE    retErrLength
  5324.  
  5325.         ADD.L    RegD0,D0
  5326.         BSR    CheckOddAddress
  5327.         BMI    retErrLength
  5328. @1
  5329.         RTS
  5330.  
  5331. PtrToXHand
  5332. PtrAndHand
  5333.         BSR    FullHandleA1
  5334.         BMI.S    @1
  5335.  
  5336.         BSR    PtrToHand
  5337. @1
  5338.         RTS
  5339.  
  5340. HandAndHand
  5341.         BSR    FullHandleA0
  5342.         BMI.S    @1
  5343.  
  5344.         BSR    FullHandleA1
  5345. @1
  5346.         RTS
  5347.  
  5348. GetScrap
  5349.         MOVE.L    Stack8,D0
  5350.         BEQ.S    @1
  5351.         BSR    CheckFullHandle    ;check the destination handle
  5352.         BMI.S    @2
  5353. @1
  5354.         BSR    RAM0        ;check the offset destination
  5355. @2
  5356.         RTS
  5357.  
  5358. PB
  5359.         BSR    RAMA0
  5360.         BMI.S    retErrParamBlock
  5361.  
  5362.         MOVE.L    RegA0,A0
  5363.  
  5364.         MOVE.L    RegPC,A1    ;get the old PC value
  5365.         BTST    #asyncTrpBit,(A1)
  5366.         BEQ.S    @1
  5367.         MOVE.L    ioCompletion(A0),D0
  5368.         BEQ.S    @1
  5369.         BSR    CheckAddress
  5370.         BMI.S    retErrCompletion
  5371. @1
  5372.         BRA    retOK
  5373.  
  5374.         ErrText    ParamBlock,ParamBlock
  5375.         ErrText    Completion,ioCompletion
  5376.  
  5377. Open
  5378. OpenRF
  5379. Create
  5380. Delete
  5381. SetFileInfo
  5382. SetFilLock
  5383. RstFilLock
  5384. SetFilType
  5385.         BSR    PB
  5386.         BMI.S    @1
  5387.  
  5388.         MOVE.L    ioFileName(A0),D0
  5389.         BSR    CheckString
  5390.         BMI.S    retErrFileName
  5391. @1
  5392.         RTS
  5393.  
  5394.         ErrText    FileName,file name
  5395.  
  5396. Read
  5397.         BSR    PB
  5398.         BMI.S    @1
  5399.  
  5400.         TST.L    ioReqCount(A0)
  5401.         BEQ    retOK
  5402.  
  5403.         MOVE.L    ioBuffer(A0),D0
  5404.         BSR    CheckOddRAM
  5405.         BMI.S    retErrBuffer
  5406.  
  5407.         ADD.L    ioReqCount(A0),D0
  5408.         SUBQ.L    #1,D0
  5409.         BSR    CheckOddRAM
  5410.         BMI.S    retErrBuffer
  5411. @1
  5412.         RTS
  5413.  
  5414.         ErrText    Buffer,ioBuffer
  5415.  
  5416. Write
  5417.         BSR    PB
  5418.         BMI.S    @1
  5419.  
  5420.         TST.L    ioReqCount(A0)
  5421.         BEQ    retOK
  5422.  
  5423.         MOVE.L    ioBuffer(A0),D0
  5424.         BSR    CheckOddAddress
  5425.         BMI.S    retErrBuffer
  5426.  
  5427.         ADD.L    ioReqCount(A0),D0
  5428.         SUBQ.L    #1,D0
  5429.         BSR    CheckOddAddress
  5430.         BMI.S    retErrBuffer
  5431. @1
  5432.         RTS
  5433.  
  5434. SetVol
  5435. UnmountVol
  5436. FlushVol
  5437. Eject
  5438. OffLine
  5439.         BSR    PB
  5440.         BMI.S    @1
  5441.  
  5442.         MOVE.L    ioVNPtr(A0),D0
  5443.         BEQ    retOK
  5444.         BSR    CheckString
  5445.         BMI.S    retErrVolName
  5446. @1
  5447.         RTS
  5448.  
  5449.         ErrText    VolName,volume name
  5450.  
  5451. GetVolInfo
  5452. GetVol
  5453.         BSR    PB
  5454.         BMI.S    @1
  5455.  
  5456.         MOVE.L    ioVNPtr(A0),D0
  5457.         BEQ    retOK
  5458.         BSR    CheckOddRAM
  5459.         BMI.S    retErrVolName
  5460. @1
  5461.         RTS
  5462.  
  5463. Rename
  5464.         BSR    PB
  5465.         BMI.S    @1
  5466.  
  5467.         MOVE.L    ioNewName(A0),D0
  5468.         BSR    CheckString
  5469.         BMI.S    retErrNewName
  5470. @1
  5471.         RTS
  5472.  
  5473.         ErrText    NewName,new name
  5474.  
  5475. GetFileInfo
  5476.         BSR    PB
  5477.         BMI.S    @1
  5478.  
  5479.         TST.W    ioFDirIndex(A0)
  5480.         BMI.S    @2
  5481.         BEQ.S    @2
  5482.  
  5483.         TST.L    ioFileName(A0)
  5484.         BEQ    retOK
  5485. @2
  5486.         MOVE.L    ioFileName(A0),D0
  5487.         BSR    CheckOddAddress
  5488.         BMI    retErrFileName
  5489. @1
  5490.         RTS
  5491.  
  5492. InitZone
  5493.         BSR    AddressA0
  5494.         BMI.S    @1
  5495.  
  5496.         MOVE.L    D0,A0
  5497.  
  5498.         MOVE.L    startPtr(A0),D0
  5499.         BSR    CheckRAM
  5500.         BMI.S    retErrStartPtr
  5501.  
  5502.         MOVE.L    limitPtr(A0),D0
  5503.         ADD.L    #10,D0
  5504.         BSR    CheckRAM
  5505.         BMI.S    retErrLimitPtr
  5506.  
  5507.         MOVE.L    pGrowZone(A0),D0
  5508.         BEQ.S    @2
  5509.         BSR    CheckAddress
  5510.         BMI.S    retErrGrowZone
  5511. @2
  5512.         MOVEQ    #0,D0
  5513.         MOVE.W    cMoreMasters(A0),D0
  5514.         NEG.L    D0
  5515.         ASL.L    #2,D0
  5516.         SUB.L    #52,D0
  5517.         SUB.L    startPtr(A0),D0
  5518.         ADD.L    limitPtr(A0),D0
  5519.         BMI.S    retErrSmallZone
  5520.  
  5521.         BRA    retOK
  5522. @1
  5523.         RTS
  5524.  
  5525.         ErrText    StartPtr,startPtr
  5526.         ErrText    LimitPtr,limitPtr
  5527.         ErrText    GrowZone,pGrowZone
  5528.         ErrText    SmallZone,zone too small
  5529.  
  5530. RecoverHandle
  5531.         BSR    RAMA0
  5532.         BMI.S    @1
  5533.  
  5534.         MOVE.L    D0,A0
  5535.  
  5536.         MOVE.L    handle-blkData(A0),D0
  5537.         ADD.L    TheZone,D0
  5538.  
  5539.         BSR    CheckHandle
  5540. @1
  5541.         RTS
  5542.  
  5543. SetApplLimit
  5544.         MOVE.L    RegA0,D0
  5545.         SUBQ.L    #2,D0
  5546.         BSR    CheckRAM
  5547.  
  5548.         RTS
  5549.  
  5550. BlockMove.
  5551.         TST.L    RegD0
  5552.         BEQ    retOK
  5553.  
  5554.         MOVE.L    RegA0,D0
  5555.         BSR    CheckOddAddress
  5556.         BMI.S    @1
  5557.  
  5558.         ADD.L    RegD0,D0
  5559.         SUBQ.L    #1,D0
  5560.         BSR    CheckOddAddress
  5561.         BMI.S    retErrLength
  5562.  
  5563.         MOVE.L    RegA1,D0
  5564.         BSR    CheckOddRAM
  5565.         BMI.S    @1
  5566.  
  5567.         ADD.L    RegD0,D0
  5568.         SUBQ.L    #1,D0
  5569.         BSR    CheckOddRAM
  5570.         BMI.S    retErrLength
  5571. @1
  5572.         RTS
  5573.  
  5574.         ErrText    Length,length
  5575.  
  5576. VInstall.
  5577. VRemove
  5578.         BSR    RAMA0
  5579.         BMI.S    @1
  5580.  
  5581.         MOVE.L    D0,A0
  5582.  
  5583.         MOVE.L    vblAddr(A0),D0
  5584.         BSR    CheckAddress
  5585.         BMI.S    retErrVBL
  5586. @1
  5587.         RTS
  5588.  
  5589.         ErrText    VBL,vblAddr
  5590.  
  5591. WriteParam
  5592.         LEA    SysParam,A0
  5593.         CMP.L    RegA0,A0
  5594.         BNE.S    retErrSysParam
  5595.  
  5596.         MOVEQ    #-1,D0
  5597.         CMP.L    RegD0,D0
  5598.         BNE    retErrMinusOne
  5599.  
  5600.         BRA    retOK
  5601.  
  5602.         ErrText    SysParam,SysParam
  5603.         ErrText    MinusOne,MinusOne
  5604.  
  5605. CmpString
  5606.         MOVE.L    RegD0,D0
  5607.         TST.W    D0
  5608.         BEQ.S    @2
  5609.  
  5610.         MOVE.L    RegA0,D0
  5611.         BSR    CheckOddAddress
  5612.         BMI.S    @1
  5613.  
  5614.         MOVE.L    RegD0,D0
  5615.         SWAP    D0
  5616.         CLR.W    D0
  5617.         SWAP    D0
  5618.         ADD.L    RegA0,D0
  5619.         SUBQ.L    #1,D0
  5620.         BSR    CheckOddAddress
  5621.         BMI    retErrStringLength
  5622. @2
  5623.         TST.W    RegD0
  5624.         BEQ    retOK
  5625.  
  5626.         MOVE.L    RegA1,D0
  5627.         BSR    CheckOddAddress
  5628.         BMI.S    @1
  5629.  
  5630.         MOVEQ    #0,D0
  5631.         MOVE.W    RegD0,D0
  5632.         ADD.L    RegA1,D0
  5633.         SUBQ.L    #1,D0
  5634.         BSR    CheckOddAddress
  5635.         BMI    retErrStringLength
  5636. @1
  5637.         RTS
  5638.  
  5639. UprString
  5640.         MOVE.L    RegD0,D0
  5641.         TST.W    D0
  5642.         BEQ    retOK
  5643.  
  5644.         MOVE.L    RegA0,D0
  5645.         BSR    CheckOddRAM
  5646.         BMI.S    @1
  5647.  
  5648.         MOVE.L    RegD0,D0
  5649.         SWAP    D0
  5650.         CLR.W    D0
  5651.         SWAP    D0
  5652.         ADD.L    RegA0,D0
  5653.         SUBQ.L    #1,D0
  5654.         BSR    CheckOddRAM
  5655.         BMI    retErrStringLength
  5656. @1
  5657.         RTS
  5658.  
  5659. StuffHex
  5660.         BSR    String0
  5661.         BMI.S    @1
  5662.  
  5663.         BSR    OddRAM4
  5664. @1
  5665.         RTS
  5666.  
  5667. StdTxMeas
  5668.         TST.W    Stack16
  5669.         BEQ.S    @2
  5670.  
  5671.         BSR    OddAddress12
  5672.         BMI.S    @1
  5673.  
  5674.         MOVEQ    #0,D0
  5675.         MOVE.W    Stack16,D0
  5676.         ADD.L    Stack12,D0
  5677.         BSR    CheckOddAddress
  5678.         BMI    retErrLength
  5679. @2
  5680.         BSR    RAM8RAM4RAM0
  5681. @1
  5682.         RTS
  5683.  
  5684. ScrollRect
  5685.         BSR    Rect8
  5686.         BMI.S    @1
  5687.  
  5688.         BSR    Rgn0
  5689. @1
  5690.         RTS
  5691.  
  5692. StdComment
  5693. PicComment
  5694.         TST.W    Stack4
  5695.         BEQ    retOK
  5696.  
  5697.         MOVE.L    Stack0,D0
  5698.         BSR    CheckFakeFullHandle
  5699.         BMI.S    @1
  5700.  
  5701.         MOVEQ    #0,D0
  5702.         MOVE.W    Stack4,D0
  5703.         MOVE.L    Stack0,A0
  5704.         ADD.L    (A0),D0
  5705.         BSR    CheckOddAddress
  5706. @1
  5707.         RTS
  5708.  
  5709. GetFNum
  5710.         BSR    String4
  5711.         BMI.S    @1
  5712.  
  5713.         BSR    RAM0
  5714. @1
  5715.         RTS
  5716.  
  5717. SetString
  5718.         BSR    FullHandle4
  5719.         BMI.S    @1
  5720.  
  5721.         BSR    String0
  5722. @1
  5723.         RTS
  5724.  
  5725. AppendMenu
  5726.         BSR    Menu4
  5727.         BMI.S    @1
  5728.  
  5729.         BSR    String0
  5730. @1
  5731.         RTS
  5732.  
  5733. ParamText
  5734.         MOVE.L    Stack12,D0
  5735.         BEQ.S    @1
  5736.         BSR    CheckString
  5737.         BMI.S    @2
  5738. @1
  5739.         MOVE.L    Stack8,D0
  5740.         BEQ.S    @3
  5741.         BSR    CheckString
  5742.         BMI.S    @2
  5743. @3
  5744.         MOVE.L    Stack4,D0
  5745.         BEQ.S    @4
  5746.         BSR    CheckString
  5747.         BMI.S    @2
  5748. @4
  5749.         MOVE.L    Stack0,D0
  5750.         BEQ    retOK
  5751.         BSR    CheckString
  5752. @2
  5753.         RTS
  5754.  
  5755. SetIText
  5756.         BSR    FullHandle4
  5757.         BMI.S    @1
  5758.  
  5759.         BSR    String0
  5760. @1
  5761.         RTS
  5762.  
  5763. GetIText
  5764.         BSR    FullHandle4
  5765.         BMI.S    @1
  5766.  
  5767.         BSR    RAM0
  5768. @1
  5769.         RTS
  5770.  
  5771. Munger
  5772.         MOVE.L    Stack20,D0
  5773.         BSR    CheckFullHandle
  5774.         BMI.S    @1
  5775.  
  5776.         MOVE.L    Stack20,A0
  5777.         _GetHandleSize
  5778.         TST.L    D0
  5779.         BMI    retErrHandle
  5780.  
  5781.         CMP.L    Stack16,D0
  5782.         BLO    retErrOffset
  5783.  
  5784.         TST.L    Stack8
  5785.         BEQ.S    @2
  5786.  
  5787.         MOVE.L    Stack12,D0
  5788.         BEQ.S    @2
  5789.         BSR    CheckOddAddress
  5790.         BMI.S    @1
  5791.  
  5792.         TST.B    Stack8
  5793.         BNE    retErrLength
  5794.  
  5795.         ADD.L    Stack8,D0
  5796.         BSR    CheckOddAddress
  5797.         BMI    retErrLength
  5798. @2
  5799.         MOVE.L    Stack4,D0
  5800.         BEQ    retOK
  5801.         BSR    CheckOddAddress
  5802.         BMI.S    @1
  5803.  
  5804.         TST.B    Stack0
  5805.         BNE    retErrLength
  5806.  
  5807.         ADD.L    Stack0,D0
  5808.         BSR    CheckOddAddress
  5809.         BMI    retErrLength
  5810. @1
  5811.         RTS
  5812.  
  5813.         ErrText    Offset,offset
  5814.  
  5815. Launch
  5816. Chain
  5817.         BSR    AddressA0
  5818.         BMI.S    @1
  5819.  
  5820.         MOVE.L    D0,A0
  5821.         MOVE.L    (A0),D0
  5822.         BSR    CheckString
  5823.         BMI    retErrFileName
  5824. @1
  5825.         RTS
  5826.  
  5827. DIPack
  5828.         MOVE.W    Stack0,D0
  5829.         CMP.W    #DILoad,D0
  5830.         BEQ    retOK
  5831.         CMP.W    #DIUnload,D0
  5832.         BEQ    retOK
  5833.         CMP.W    #DIBadMount,D0
  5834.         BEQ    retOK
  5835.         CMP.W    #DIFormat,D0
  5836.         BEQ    retOK
  5837.         CMP.W    #DIVerify,D0
  5838.         BEQ    retOK
  5839.         CMP.W    #DIZero,D0
  5840.         BEQ    String2
  5841.         BRA.S    retErrSelector
  5842.  
  5843.         ErrText    Selector,selector
  5844.  
  5845. SFPack
  5846.         MOVE.W    Stack0,D0
  5847.         CMP.W    #SFPutFile,D0
  5848.         BEQ    SFPutFile.
  5849.         CMP.W    #SFPPutFile,D0
  5850.         BEQ    SFPPutFile.
  5851.         CMP.W    #SFGetFile,D0
  5852.         BEQ    SFGetFile.
  5853.         CMP.W    #SFPGetFile,D0
  5854.         BEQ    SFPGetFile.
  5855.         BRA.S    retErrSelector
  5856.  
  5857. SFPutFile.
  5858.         BSR    String14
  5859.         BMI.S    @1
  5860.  
  5861.         BSR    String10
  5862.         BMI.S    @1
  5863.  
  5864.         MOVE.L    Stack6,D0
  5865.         BEQ.S    @2
  5866.         BSR    CheckAddress
  5867.         BMI.S    @1
  5868. @2
  5869.         BSR    RAM2
  5870. @1
  5871.         RTS
  5872.  
  5873. SFPPutFile.
  5874.         BSR    String20
  5875.         BMI.S    @1
  5876.  
  5877.         BSR    String16
  5878.         BMI.S    @1
  5879.  
  5880.         MOVE.L    Stack12,D0
  5881.         BEQ.S    @2
  5882.         BSR    CheckAddress
  5883.         BMI.S    @1
  5884. @2
  5885.         BSR    RAM8
  5886.         BMI.S    @1
  5887.  
  5888.         MOVE.L    Stack2,D0
  5889.         BEQ    retOK
  5890.         BSR    CheckAddress
  5891. @1
  5892.         RTS
  5893.  
  5894. SFGetFile.
  5895.         BSR    String20
  5896.         BMI.S    @1
  5897.  
  5898.         MOVE.L    Stack16,D0
  5899.         BEQ.S    @2
  5900.         BSR    CheckAddress
  5901.         BMI.S    @1
  5902. @2
  5903.         MOVE.W    Stack12,D0
  5904.         BEQ.S    @3
  5905.         CMP.W    #-1,D0
  5906.         BEQ.S    @3
  5907.  
  5908.         BSR    Address10
  5909.         BMI.S    @1
  5910. @3
  5911.         MOVE.L    Stack6,D0
  5912.         BEQ.S    @4
  5913.         BSR    CheckAddress
  5914.         BMI.S    @1
  5915. @4
  5916.         BSR    RAM2
  5917. @1
  5918.         RTS
  5919.  
  5920. SFPGetFile.
  5921.         BSR    String26
  5922.         BMI.S    @1
  5923.  
  5924.         MOVE.L    Stack22,D0
  5925.         BEQ.S    @2
  5926.         BSR    CheckAddress
  5927.         BMI.S    @1
  5928. @2
  5929.         MOVE.W    Stack18,D0
  5930.         BEQ.S    @3
  5931.         CMP.W    #-1,D0
  5932.         BEQ.S    @3
  5933.  
  5934.         BSR    Address16
  5935.         BMI.S    @1
  5936. @3
  5937.         MOVE.L    Stack12,D0
  5938.         BEQ.S    @4
  5939.         BSR    CheckAddress
  5940.         BMI.S    @1
  5941. @4
  5942.         BSR    RAM8
  5943.         BMI.S    @1
  5944.  
  5945.         MOVE.L    Stack2,D0
  5946.         BEQ    retOK
  5947.         BSR    CheckAddress
  5948. @1
  5949.         RTS
  5950.  
  5951. SANEPack
  5952.         MOVE.W    Stack0,D0
  5953.         AND.W    #$7FF,D0
  5954.         CMP.W    #$1D,D0
  5955.         BHS    retErrSelector
  5956.         BRA    retOK
  5957.  
  5958. ElemsPack
  5959.         MOVE.W    Stack0,D0
  5960.         LEA    ElemsTable,A0
  5961. @1
  5962.         CMP.W    #$FFFF,(A0)
  5963.         BEQ    retErrSelector
  5964.         CMP.W    (A0)+,D0
  5965.         BEQ    retOK
  5966.         BRA.S    @1
  5967.  
  5968. ElemsTable
  5969.         DC.W    $0000,$0002,$0004,$0006,$0008,$000A,$000C,$000E
  5970.         DC.W    $8010,$8012,$C014,$C016,$0018,$001A,$001C,$001E
  5971.         DC.W    $0020,$FFFF
  5972.  
  5973. IUPack
  5974.         MOVE.W    Stack0,D0
  5975.         CMP.W    #IUDateString,D0
  5976.         BEQ    RAM2
  5977.         CMP.W    #IUDatePString,D0
  5978.         BEQ    IUDatePString.
  5979.         CMP.W    #IUTimeString,D0
  5980.         BEQ    RAM2
  5981.         CMP.W    #IUTimePString,D0
  5982.         BEQ    IUTimePString.
  5983.         CMP.W    #IUMetric,D0
  5984.         BEQ    retOK
  5985.         CMP.W    #IUGetIntl,D0
  5986.         BEQ    retOK
  5987.         CMP.W    #IUSetIntl,D0
  5988.         BEQ    FullHandle2
  5989.         CMP.W    #IUMagString,D0
  5990.         BEQ    IUMagString.
  5991.         CMP.W    #IUMagIDString,D0
  5992.         BEQ    IUMagIDString.
  5993.         BRA    retErrSelector
  5994.  
  5995. IUDatePString.
  5996. IUTimePString.
  5997.         BSR    RAM6
  5998.         BMI.S    @1
  5999.  
  6000.         BSR    FullHandle0
  6001. @1
  6002.         RTS
  6003.  
  6004. IUMagString.
  6005. IUMagIDString.
  6006.         TST.W    Stack4
  6007.         BEQ.S    @2
  6008.  
  6009.         MOVE.L    Stack10,D0
  6010.         BSR    CheckOddAddress
  6011.         BMI.S    @1
  6012.  
  6013.         MOVEQ    #0,D0
  6014.         MOVE.W    Stack4,D0
  6015.         ADD.L    Stack10,D0
  6016.         SUBQ.L    #1,D0
  6017.         BSR    CheckOddAddress
  6018.         BMI    retErrStringLength
  6019. @2
  6020.         TST.W    Stack2
  6021.         BEQ    retOK
  6022.  
  6023.         MOVE.L    Stack6,D0
  6024.         BSR    CheckOddAddress
  6025.         BMI.S    @1
  6026.  
  6027.         MOVEQ    #0,D0
  6028.         MOVE.W    Stack2,D0
  6029.         ADD.L    Stack6,D0
  6030.         SUBQ.L    #1,D0
  6031.         BSR    CheckOddAddress
  6032.         BMI    retErrStringLength
  6033. @1
  6034.         RTS
  6035.  
  6036. BDPack
  6037.         MOVE.W    Stack0,D0
  6038.         CMP.W    #NumToString,D0
  6039.         BEQ    OddRAMA0
  6040.         CMP.W    #StringToNum,D0
  6041.         BEQ    StringA0
  6042.         BRA    retErrSelector
  6043.  
  6044. ;+--------------------------------------------------------------------+
  6045. ;| These are the dispatch tables: 0 means no discipline for that trap |
  6046. ;+--------------------------------------------------------------------+
  6047.  
  6048. OSTraps
  6049.         DC.W    Open-OSTraps        ; 0 Open
  6050.         DC.W    PB-OSTraps        ; 1 Close
  6051.         DC.W    Read-OSTraps        ; 2 Read
  6052.         DC.W    Write-OSTraps        ; 3 Write
  6053.         DC.W    PB-OSTraps        ; 4 Control
  6054.         DC.W    PB-OSTraps        ; 5 Status
  6055.         DC.W    PB-OSTraps        ; 6 KillIO
  6056.         DC.W    GetVolInfo-OSTraps    ; 7 GetVolInfo
  6057.         DC.W    Create-OSTraps        ; 8 Create
  6058.         DC.W    Delete-OSTraps        ; 9 Delete
  6059.         DC.W    OpenRF-OSTraps        ; A OpenRF
  6060.         DC.W    Rename-OSTraps        ; B Rename
  6061.         DC.W    GetFileInfo-OSTraps    ; C GetFileInfo
  6062.         DC.W    SetFileInfo-OSTraps    ; D SetFileInfo
  6063.         DC.W    UnmountVol-OSTraps    ; E UnmountVol
  6064.         DC.W    PB-OSTraps        ; F MountVol
  6065.         DC.W    PB-OSTraps        ; 10 Allocate
  6066.         DC.W    PB-OSTraps        ; 11 GetEOF
  6067.         DC.W    PB-OSTraps        ; 12 SetEOF
  6068.         DC.W    FlushVol-OSTraps    ; 13 FlushVol
  6069.         DC.W    GetVol-OSTraps        ; 14 GetVol
  6070.         DC.W    SetVol-OSTraps        ; 15 SetVol
  6071.         DC.W    0        ; 16
  6072.         DC.W    Eject-OSTraps        ; 17 Eject
  6073.         DC.W    PB-OSTraps        ; 18 GetFPos
  6074.         DC.W    InitZone-OSTraps    ; 19 InitZone
  6075.         DC.W    0        ; 1A
  6076.         DC.W    ZoneA0-OSTraps        ; 1B SetZone
  6077.         DCB.W    $1F-$1C,0    ; 1C-1E
  6078.         DC.W    PtrA0-OSTraps        ; 1F DisposPtr
  6079.         DC.W    PtrA0-OSTraps        ; 20 SetPtrSize
  6080.         DC.W    PtrA0-OSTraps        ; 21 GetPtrSize
  6081.         DC.W    0        ; 22
  6082.         DC.W    HandleA0-OSTraps    ; 23 DisposHandle
  6083.         DC.W    HandleA0-OSTraps    ; 24 SetHandleSize
  6084.         DC.W    HandleA0-OSTraps    ; 25 GetHandleSize
  6085.         DC.W    HandleA0-OSTraps    ; 26 HandleZone
  6086.         DC.W    HandleA0-OSTraps    ; 27 ReallocHandle
  6087.         DC.W    RecoverHandle-OSTraps    ; 28 RecoverHandle
  6088.         DC.W    HandleA0-OSTraps    ; 29 HLock
  6089.         DC.W    HandleA0-OSTraps    ; 2A HUnlock
  6090.         DC.W    HandleA0-OSTraps    ; 2B EmptyHandle
  6091.         DC.W    0        ; 2C
  6092.         DC.W    SetApplLimit-OSTraps    ; 2D SetApplLimit
  6093.         DC.W    BlockMove.-OSTraps    ; 2E BlockMove
  6094.         DC.W    0        ; 2F
  6095.         DC.W    RAMA0-OSTraps        ; 30 OSEventAvail
  6096.         DC.W    RAMA0-OSTraps        ; 31 GetOSEvent
  6097.         DC.W    0        ; 32
  6098.         DC.W    VInstall.-OSTraps    ; 33 VInstall
  6099.         DC.W    VRemove-OSTraps        ; 34 VRemove
  6100.         DC.W    OffLine-OSTraps        ; 35 OffLine
  6101.         DC.W    0        ; 36
  6102.         DC.W    0        ; 37
  6103.         DC.W    WriteParam-OSTraps    ; 38 WriteParam
  6104.         DC.W    RAMA0-OSTraps        ; 39 ReadDateTime
  6105.         DC.W    0        ; 3A
  6106.         DC.W    0        ; 3B
  6107.         DC.W    CmpString-OSTraps    ; 3C CmpString
  6108.         DCB.W    $41-$3D,0    ; 3D-40
  6109.         DC.W    SetFilLock-OSTraps    ; 41 SetFilLock
  6110.         DC.W    RstFilLock-OSTraps    ; 42 RstFilLock
  6111.         DC.W    SetFilType-OSTraps    ; 43 SetFilType
  6112.         DC.W    PB-OSTraps        ; 44 SetFPos
  6113.         DC.W    PB-OSTraps        ; 45 FlushFile
  6114.         DC.W    0        ; 46
  6115.         DC.W    SetTrapAddress-OSTraps    ; 47 SetTrapAddress
  6116.         DC.W    PtrA0-OSTraps        ; 48 PtrZone
  6117.         DC.W    HandleA0-OSTraps    ; 49 HPurge
  6118.         DC.W    HandleA0-OSTraps    ; 4A HNoPurge
  6119.         DC.W    ProcA0-OSTraps        ; 4B SetGrowZone
  6120.         DCB.W    $54-$4C,0    ; 4C-53
  6121.         DC.W    UprString-OSTraps    ; 54 UprString
  6122.         DC.W    0        ; 55
  6123.         DC.W    0        ; 56
  6124.         DC.W    RAMA0-OSTraps        ; 57 SetApplBase
  6125.         DCB.W    $100-$58,0    ; 58-FF
  6126.  
  6127. ToolTraps
  6128.         DCB.W    $51-$0,0    ; 0-50
  6129.         DC.W    Cursor0-ToolTraps    ; 51 SetCursor
  6130.         DCB.W    $55-$52,0    ; 52-54
  6131.         DC.W    Rect4-ToolTraps        ; 55 ShieldCursor
  6132.         DCB.W    $5D-$56,0    ; 56-5C
  6133.         DC.W    OddAddress4-ToolTraps    ; 5D BitTst
  6134.         DC.W    OddRAM4-ToolTraps    ; 5E BitSet
  6135.         DC.W    OddRAM4-ToolTraps    ; 5F BitClr
  6136.         DCB.W    $66-$60,0    ; 60-65
  6137.         DC.W    StuffHex-ToolTraps    ; 66 StuffHex
  6138.         DCB.W    $6D-$67,0    ; 67-6C
  6139.         DC.W    RAM0-ToolTraps        ; 6D InitPort
  6140.         DC.W    RAM0-ToolTraps        ; 6E InitGraf
  6141.         DC.W    RAM0-ToolTraps        ; 6F OpenPort
  6142.         DC.W    RAM0-ToolTraps        ; 70 LocalToGlobal
  6143.         DC.W    RAM0-ToolTraps        ; 71 GlobalToLocal
  6144.         DC.W    0        ; 72
  6145.         DC.W    0        ; 73
  6146.         DC.W    RAM0-ToolTraps        ; 74 GetPort
  6147.         DC.W    BitMap0-ToolTraps    ; 75 SetPortBits
  6148.         DCB.W    $79-$76,0    ; 76-78
  6149.         DC.W    Rgn0-ToolTraps        ; 79 SetClip
  6150.         DC.W    Rgn0-ToolTraps        ; 7A GetClip
  6151.         DC.W    Address0-ToolTraps    ; 7B ClipRect
  6152.         DC.W    RAM0-ToolTraps        ; 7C BackPat
  6153.         DC.W    Port0-ToolTraps        ; 7D ClosePort
  6154.         DC.W    RAM0-ToolTraps        ; 7E AddPt
  6155.         DC.W    RAM0-ToolTraps        ; 7F SubPt
  6156.         DC.W    RAM4-ToolTraps        ; 80 SetPt
  6157.         DC.W    0        ; 81
  6158.         DC.W    OddAddress8-ToolTraps    ; 82 StdText
  6159.         DC.W    0        ; 83
  6160.         DC.W    String0-ToolTraps    ; 84 DrawString
  6161.         DC.W    OddAddress4-ToolTraps    ; 85 DrawText
  6162.         DC.W    OddAddress4-ToolTraps    ; 86 TextWidth
  6163.         DCB.W    $8B-$87,0    ; 87-8A
  6164.         DC.W    RAM0-ToolTraps        ; 8B GetFontInfo
  6165.         DC.W    String0-ToolTraps    ; 8C StringWidth
  6166.         DCB.W    $98-$8D,0    ; 8D-97
  6167.         DC.W    RAM0-ToolTraps        ; 98 GetPenState
  6168.         DC.W    RAM0-ToolTraps        ; 99 SetPenState
  6169.         DC.W    RAM0-ToolTraps        ; 9A GetPen
  6170.         DCB.W    $A0-$9B,0    ; 9B-9F
  6171.         DC.W    Rect0-ToolTraps        ; A0 StdRect
  6172.         DC.W    Rect0-ToolTraps        ; A1 FrameRect
  6173.         DC.W    Rect0-ToolTraps        ; A2 PaintRect
  6174.         DC.W    Rect0-ToolTraps        ; A3 EraseRect
  6175.         DC.W    Rect0-ToolTraps        ; A4 InvertRect
  6176.         DC.W    FillRect-ToolTraps    ; A5 FillRect
  6177.         DC.W    EqualRect-ToolTraps    ; A6 EqualRect
  6178.         DC.W    RAM8-ToolTraps        ; A7 SetRect
  6179.         DC.W    Address4-ToolTraps    ; A8 OffsetRect
  6180.         DC.W    Address4-ToolTraps    ; A9 InsetRect
  6181.         DC.W    SectRect-ToolTraps    ; AA SectRect
  6182.         DC.W    UnionRect-ToolTraps    ; AB UnionRect
  6183.         DC.W    RAM0-ToolTraps        ; AC Pt2Rect
  6184.         DC.W    Address0-ToolTraps    ; AD PtInRect
  6185.         DC.W    Address0-ToolTraps    ; AE EmptyRect
  6186.         DC.W    Rect4-ToolTraps        ; AF StdRRect
  6187.         DC.W    Rect4-ToolTraps        ; B0 FrameRoundRect
  6188.         DC.W    Rect4-ToolTraps        ; B1 PaintRoundRect
  6189.         DC.W    Rect4-ToolTraps        ; B2 EraseRoundRect
  6190.         DC.W    Rect4-ToolTraps        ; B3 InvertRoundRect
  6191.         DC.W    FillRoundRect-ToolTraps    ; B4 FillRoundRect
  6192.         DC.W    0        ; B5
  6193.         DC.W    Rect0-ToolTraps        ; B6 StdOval
  6194.         DC.W    Rect0-ToolTraps        ; B7 FrameOval
  6195.         DC.W    Rect0-ToolTraps        ; B8 PaintOval
  6196.         DC.W    Rect0-ToolTraps        ; B9 EraseOval
  6197.         DC.W    Rect0-ToolTraps        ; BA InvertOval
  6198.         DC.W    FillOval-ToolTraps    ; BB FillOval
  6199.         DC.W    0        ; BC
  6200.         DC.W    Rect4-ToolTraps        ; BD StdArc
  6201.         DC.W    Rect4-ToolTraps        ; BE FrameArc
  6202.         DC.W    Rect4-ToolTraps        ; BF PaintArc
  6203.         DC.W    Rect4-ToolTraps        ; C0 EraseArc
  6204.         DC.W    Rect4-ToolTraps        ; C1 InvertArc
  6205.         DC.W    FillArc-ToolTraps    ; C2 FillArc
  6206.         DC.W    PtToAngle-ToolTraps    ; C3 PtToAngle
  6207.         DC.W    0        ; C4
  6208.         DC.W    Poly0-ToolTraps        ; C5 StdPoly
  6209.         DC.W    Poly0-ToolTraps        ; C6 FramePoly
  6210.         DC.W    Poly0-ToolTraps        ; C7 PaintPoly
  6211.         DC.W    Poly0-ToolTraps        ; C8 ErasePoly
  6212.         DC.W    Poly0-ToolTraps        ; C9 InvertPoly
  6213.         DC.W    FillPoly-ToolTraps    ; CA FillPoly
  6214.         DC.W    0        ; CB
  6215.         DC.W    0        ; CC
  6216.         DC.W    Poly0-ToolTraps        ; CD KillPoly
  6217.         DC.W    Poly4-ToolTraps        ; CE OffsetPoly
  6218.         DC.W    0        ; CF
  6219.         DC.W    0        ; D0
  6220.         DC.W    Rgn0-ToolTraps        ; D1 StdRgn
  6221.         DC.W    Rgn0-ToolTraps        ; D2 FrameRgn
  6222.         DC.W    Rgn0-ToolTraps        ; D3 PaintRgn
  6223.         DC.W    Rgn0-ToolTraps        ; D4 EraseRgn
  6224.         DC.W    Rgn0-ToolTraps        ; D5 InvertRgn
  6225.         DC.W    FillRgn-ToolTraps    ; D6 FillRgn
  6226.         DC.W    0        ; D7
  6227.         DC.W    0        ; D8
  6228.         DC.W    Rgn0-ToolTraps        ; D9 DisposeRgn
  6229.         DC.W    0        ; DA
  6230.         DC.W    Rgn0-ToolTraps        ; DB CloseRgn
  6231.         DC.W    CopyRgn-ToolTraps    ; DC CopyRgn
  6232.         DC.W    Rgn0-ToolTraps        ; DD SetEmptyRgn
  6233.         DC.W    Rgn8-ToolTraps        ; DE SetRectRgn
  6234.         DC.W    RectRgn-ToolTraps    ; DF RectRgn
  6235.         DC.W    Rgn4-ToolTraps        ; E0 OffsetRgn
  6236.         DC.W    Rgn4-ToolTraps        ; E1 InsetRgn
  6237.         DC.W    Rgn0-ToolTraps        ; E2 EmptyRgn
  6238.         DC.W    EqualRgn-ToolTraps    ; E3 EqualRgn
  6239.         DC.W    SectRgn-ToolTraps    ; E4 SectRgn
  6240.         DC.W    UnionRgn-ToolTraps    ; E5 UnionRgn
  6241.         DC.W    DiffRgn-ToolTraps    ; E6 DiffRgn
  6242.         DC.W    XorRgn-ToolTraps    ; E7 XorRgn
  6243.         DC.W    Rgn0-ToolTraps        ; E8 PtInRgn
  6244.         DC.W    RectInRgn-ToolTraps    ; E9 RectInRgn
  6245.         DC.W    RAM0-ToolTraps        ; EA SetStdProcs
  6246.         DC.W    StdBits-ToolTraps    ; EB StdBits
  6247.         DC.W    CopyBits-ToolTraps    ; EC CopyBits
  6248.         DC.W    StdTxMeas-ToolTraps    ; ED StdTxMeas
  6249.         DC.W    OddRAM4-ToolTraps    ; EE StdGetPic
  6250.         DC.W    ScrollRect-ToolTraps    ; EF ScrollRect
  6251.         DC.W    OddAddress4-ToolTraps    ; F0 StdPutPic
  6252.         DC.W    StdComment-ToolTraps    ; F1 StdComment
  6253.         DC.W    PicComment-ToolTraps    ; F2 PicComment
  6254.         DC.W    Rect0-ToolTraps        ; F3 OpenPicture
  6255.         DC.W    0        ; F4
  6256.         DC.W    Pict0-ToolTraps        ; F5 KillPicture
  6257.         DC.W    DrawPicture-ToolTraps    ; F6 DrawPicture
  6258.         DC.W    0        ; F7
  6259.         DC.W    ScalePt-ToolTraps    ; F8 ScalePt
  6260.         DC.W    MapPt-ToolTraps        ; F9 MapPt
  6261.         DC.W    MapRect-ToolTraps    ; FA MapRect
  6262.         DC.W    MapRgn-ToolTraps    ; FB MapRgn
  6263.         DC.W    MapPoly-ToolTraps    ; FC MapPoly
  6264.         DC.W    0        ; FD
  6265.         DC.W    0        ; FE
  6266.         DC.W    RAM0-ToolTraps        ; FF GetFontName
  6267.         DC.W    GetFNum-ToolTraps    ; 100 GetFNum
  6268.         DC.W    RAM0-ToolTraps        ; 101 SwapFont
  6269.         DC.W    0        ; 102
  6270.         DC.W    0        ; 103
  6271.         DC.W    Window0-ToolTraps    ; 104 DrawGrowIcon
  6272.         DC.W    DragGrayRgn-ToolTraps    ; 105 DragGrayRgn
  6273.         DC.W    String0-ToolTraps    ; 106 NewString
  6274.         DC.W    SetString-ToolTraps    ; 107 SetString
  6275.         DC.W    Window2-ToolTraps    ; 108 ShowHide
  6276.         DC.W    CalcVis-ToolTraps    ; 109 CalcVis
  6277.         DC.W    CalcVisBehind-ToolTraps    ; 10A CalcVisBehind
  6278.         DC.W    ClipAbove-ToolTraps    ; 10B ClipAbove
  6279.         DC.W    PaintOne-ToolTraps    ; 10C PaintOne
  6280.         DC.W    PaintBehind-ToolTraps    ; 10D PaintBehind
  6281.         DC.W    Window0-ToolTraps    ; 10E SaveOld
  6282.         DC.W    Window2-ToolTraps    ; 10F DrawNew
  6283.         DC.W    RAM0-ToolTraps        ; 110 GetWMgrPort
  6284.         DC.W    RAM0-ToolTraps        ; 111 CheckUpdate
  6285.         DC.W    0        ; 112
  6286.         DC.W    NewWindow-ToolTraps    ; 113 NewWindow
  6287.         DC.W    DisposeWindow-ToolTraps    ; 114 DisposeWindow
  6288.         DC.W    Window0-ToolTraps    ; 115 ShowWindow
  6289.         DC.W    Window0-ToolTraps    ; 116 HideWindow
  6290.         DC.W    Window0-ToolTraps    ; 117 GetWRefCon
  6291.         DC.W    Window4-ToolTraps    ; 118 SetWRefCon
  6292.         DC.W    GetWTitle-ToolTraps    ; 119 GetWTitle
  6293.         DC.W    SetWTitle-ToolTraps    ; 11A SetWTitle
  6294.         DC.W    Window6-ToolTraps    ; 11B MoveWindow
  6295.         DC.W    Window2-ToolTraps    ; 11C HiliteWindow
  6296.         DC.W    Window6-ToolTraps    ; 11D SizeWindow
  6297.         DC.W    Window4-ToolTraps    ; 11E TrackGoAway
  6298.         DC.W    Window0-ToolTraps    ; 11F SelectWindow
  6299.         DC.W    Window0-ToolTraps    ; 120 BringToFront
  6300.         DC.W    SendBehind-ToolTraps    ; 121 SendBehind
  6301.         DC.W    BeginUpdate-ToolTraps    ; 122 BeginUpdate
  6302.         DC.W    EndUpdate-ToolTraps    ; 123 EndUpdate
  6303.         DC.W    0        ; 124
  6304.         DC.W    DragWindow-ToolTraps    ; 125 DragWindow
  6305.         DC.W    DragTheRgn-ToolTraps    ; 126 DragTheRgn
  6306.         DC.W    Rgn0-ToolTraps        ; 127 InvalRgn
  6307.         DC.W    Address0-ToolTraps    ; 128 InvalRect
  6308.         DC.W    Rgn0-ToolTraps        ; 129 ValidRgn
  6309.         DC.W    Address0-ToolTraps    ; 12A ValidRect
  6310.         DC.W    GrowWindow-ToolTraps    ; 12B GrowWindow
  6311.         DC.W    RAM0-ToolTraps        ; 12C FindWindow
  6312.         DC.W    Window0-ToolTraps    ; 12D CloseWindow
  6313.         DC.W    Window4-ToolTraps    ; 12E SetWindowPic
  6314.         DC.W    Window0-ToolTraps    ; 12F GetWindowPic
  6315.         DC.W    0        ; 130
  6316.         DC.W    String0-ToolTraps    ; 131 NewMenu
  6317.         DC.W    Menu0-ToolTraps        ; 132 DisposeMenu
  6318.         DC.W    AppendMenu-ToolTraps    ; 133 AppendMenu
  6319.         DC.W    0        ; 134
  6320.         DC.W    Menu2-ToolTraps        ; 135 InsertMenu
  6321.         DCB.W    $139-$136,0    ; 136-138
  6322.         DC.W    Menu2-ToolTraps        ; 139 EnableItem
  6323.         DC.W    Menu2-ToolTraps        ; 13A DisableItem
  6324.         DC.W    0        ; 13B
  6325.         DC.W    FullHandle0-ToolTraps    ; 13C SetMenuBar
  6326.         DC.W    0        ; 13D
  6327.         DC.W    0        ; 13E
  6328.         DC.W    GetItemIcon-ToolTraps    ; 13F GetItemIcon
  6329.         DC.W    Menu4-ToolTraps        ; 140 SetItemIcon
  6330.         DC.W    GetItemStyle-ToolTraps    ; 141 GetItemStyle
  6331.         DC.W    Menu4-ToolTraps        ; 142 SetItemStyle
  6332.         DC.W    GetItemMark-ToolTraps    ; 143 GetItemMark
  6333.         DC.W    Menu4-ToolTraps        ; 144 SetItemMark
  6334.         DC.W    Menu4-ToolTraps        ; 145 CheckItem
  6335.         DC.W    GetItem-ToolTraps    ; 146 GetItem
  6336.         DC.W    SetItem-ToolTraps    ; 147 SetItem
  6337.         DC.W    Menu0-ToolTraps        ; 148 CalcMenuSize
  6338.         DC.W    0        ; 149
  6339.         DC.W    0        ; 14A
  6340.         DC.W    PlotIcon-ToolTraps    ; 14B PlotIcon
  6341.         DC.W    0        ; 14C
  6342.         DC.W    Menu4-ToolTraps        ; 14D AddResMenu
  6343.         DC.W    Rect4-ToolTraps        ; 14E PinRect
  6344.         DC.W    0        ; 14F
  6345.         DC.W    Menu0-ToolTraps        ; 150 CountMItems
  6346.         DC.W    Menu6-ToolTraps        ; 151 InsertResMenu
  6347.         DC.W    0        ; 152
  6348.         DC.W    0        ; 153
  6349.         DC.W    NewControl-ToolTraps    ; 154 NewControl
  6350.         DC.W    Control0-ToolTraps    ; 155 DisposeControl
  6351.         DC.W    Window0-ToolTraps    ; 156 KillControls
  6352.         DC.W    Control0-ToolTraps    ; 157 ShowControl
  6353.         DC.W    FullHandle0-ToolTraps    ; 158 HideControl
  6354.         DC.W    Control4-ToolTraps    ; 159 MoveControl
  6355.         DC.W    Control0-ToolTraps    ; 15A GetCRefCon
  6356.         DC.W    Control4-ToolTraps    ; 15B SetCRefCon
  6357.         DC.W    Control4-ToolTraps    ; 15C SizeControl
  6358.         DC.W    Control2-ToolTraps    ; 15D HiliteControl
  6359.         DC.W    GetCTitle-ToolTraps    ; 15E GetCTitle
  6360.         DC.W    SetCTitle-ToolTraps    ; 15F SetCTitle
  6361.         DC.W    Control0-ToolTraps    ; 160 GetCtlValue
  6362.         DC.W    Control0-ToolTraps    ; 161 GetCtlMin
  6363.         DC.W    Control0-ToolTraps    ; 162 GetCtlMax
  6364.         DC.W    Control2-ToolTraps    ; 163 SetCtlValue
  6365.         DC.W    Control2-ToolTraps    ; 164 SetCtlMin
  6366.         DC.W    Control2-ToolTraps    ; 165 SetCtlMax
  6367.         DC.W    Control4-ToolTraps    ; 166 TestControl
  6368.         DC.W    DragControl-ToolTraps    ; 167 DragControl
  6369.         DC.W    Control8-ToolTraps    ; 168 TrackControl
  6370.         DC.W    Window0-ToolTraps    ; 169 DrawControls
  6371.         DC.W    Control0-ToolTraps    ; 16A GetCtlAction
  6372.         DC.W    Control4-ToolTraps    ; 16B SetCtlAction
  6373.         DC.W    FindControl-ToolTraps    ; 16C FindControl
  6374.         DC.W    0        ; 16D
  6375.         DC.W    Dequeue-ToolTraps    ; 16E Dequeue
  6376.         DC.W    Enqueue-ToolTraps    ; 16F Enqueue
  6377.         DC.W    RAM0-ToolTraps        ; 170 GetNextEvent
  6378.         DC.W    RAM0-ToolTraps        ; 171 EventAvail
  6379.         DC.W    RAM0-ToolTraps        ; 172 GetMouse
  6380.         DCB.W    $176-$173,0    ; 173-175
  6381.         DC.W    RAM0-ToolTraps        ; 176 GetKeys
  6382.         DCB.W    $17B-$177,0    ; 177-17A
  6383.         DC.W    Proc0-ToolTraps        ; 17B InitDialogs
  6384.         DC.W    GetNewDialog-ToolTraps    ; 17C GetNewDialog
  6385.         DC.W    NewDialog-ToolTraps    ; 17D NewDialog
  6386.         DC.W    Dialog6-ToolTraps    ; 17E SelIText
  6387.         DC.W    Address0-ToolTraps    ; 17F IsDialogEvent
  6388.         DC.W    DialogSelect-ToolTraps    ; 180 DialogSelect
  6389.         DC.W    Dialog0-ToolTraps    ; 181 DrawDialog
  6390.         DC.W    Dialog0-ToolTraps    ; 182 CloseDialog
  6391.         DC.W    DisposDialog-ToolTraps    ; 183 DisposDialog
  6392.         DC.W    0        ; 184
  6393.         DC.W    Proc0-ToolTraps        ; 185 Alert
  6394.         DC.W    Proc0-ToolTraps        ; 186 StopAlert
  6395.         DC.W    Proc0-ToolTraps        ; 187 NoteAlert
  6396.         DC.W    Proc0-ToolTraps        ; 188 CautionAlert
  6397.         DC.W    0        ; 189
  6398.         DC.W    0        ; 18A
  6399.         DC.W    ParamText-ToolTraps    ; 18B ParamText
  6400.         DC.W    Proc0-ToolTraps        ; 18C ErrorSound
  6401.         DC.W    GetDItem-ToolTraps    ; 18D GetDItem
  6402.         DC.W    SetDItem-ToolTraps    ; 18E SetDItem
  6403.         DC.W    SetIText-ToolTraps    ; 18F SetIText
  6404.         DC.W    GetIText-ToolTraps    ; 190 GetIText
  6405.         DC.W    ModalDialog-ToolTraps    ; 191 ModalDialog
  6406.         DCB.W    $19F-$192,0    ; 192-19E
  6407.         DC.W    RAM2-ToolTraps        ; 19F GetIndType
  6408.         DCB.W    $1A8-$1A0,0    ; 1A0-1A7
  6409.         DC.W    GetResInfo-ToolTraps    ; 1A8 GetResInfo
  6410.         DC.W    String0-ToolTraps    ; 1A9 SetResInfo
  6411.         DC.W    0        ; 1AA
  6412.         DC.W    String0-ToolTraps    ; 1AB AddResorce
  6413.         DCB.W    $1B3-$1AC,0    ; 1AC-1B2
  6414.         DC.W    SystemClick-ToolTraps    ; 1B3 SystemClick
  6415.         DCB.W    $1BD-$1B4,0    ; 1B4-1BC
  6416.         DC.W    GetNewWindow-ToolTraps    ; 1BD GetNewWindow
  6417.         DC.W    Window0-ToolTraps    ; 1BE GetNewControl
  6418.         DCB.W    $1C6-$1BF,0    ; 1BF-1C5
  6419.         DC.W    RAMA0-ToolTraps        ; 1C6 Secs2Date
  6420.         DC.W    RAMA0-ToolTraps        ; 1C7 Date2Secs
  6421.         DCB.W    $1CB-$1C8,0    ; 1C8-1CA
  6422.         DC.W    TERec0-ToolTraps    ; 1CB TEGetText
  6423.         DC.W    0        ; 1CC
  6424.         DC.W    TERec0-ToolTraps    ; 1CD TEDispose
  6425.         DC.W    Rect2-ToolTraps        ; 1CE TextBox
  6426.         DC.W    TERec0-ToolTraps    ; 1CF TESetText
  6427.         DC.W    TERec0-ToolTraps    ; 1D0 TECalText
  6428.         DC.W    TERec0-ToolTraps    ; 1D1 TESetSelect
  6429.         DC.W    TENew-ToolTraps        ; 1D2 TENew
  6430.         DC.W    TEUpdate-ToolTraps    ; 1D3 TEUpdate
  6431.         DC.W    TERec0-ToolTraps    ; 1D4 TEClick
  6432.         DC.W    TERec0-ToolTraps    ; 1D5 TECopy
  6433.         DC.W    TERec0-ToolTraps    ; 1D6 TECut
  6434.         DC.W    TERec0-ToolTraps    ; 1D7 TEDelete
  6435.         DC.W    TERec0-ToolTraps    ; 1D8 TEActivate
  6436.         DC.W    TERec0-ToolTraps    ; 1D9 TEDeactivate
  6437.         DC.W    TERec0-ToolTraps    ; 1DA TEIdle
  6438.         DC.W    TERec0-ToolTraps    ; 1DB TEPaste
  6439.         DC.W    TERec0-ToolTraps    ; 1DC TEKey
  6440.         DC.W    TERec0-ToolTraps    ; 1DD TEScroll
  6441.         DC.W    TERec0-ToolTraps    ; 1DE TEInsert
  6442.         DC.W    TERec0-ToolTraps    ; 1DF TESetJust
  6443.         DC.W    Munger-ToolTraps    ; 1E0 Munger
  6444.         DC.W    FullHandleA0-ToolTraps    ; 1E1 HandToHand
  6445.         DC.W    PtrToXHand-ToolTraps    ; 1E2 PtrToXHand
  6446.         DC.W    PtrToHand-ToolTraps    ; 1E3 PtrToHand
  6447.         DC.W    HandAndHand-ToolTraps    ; 1E4 HandAndHand
  6448.         DCB.W    $1E9-$1E5,0    ; 1E5-1E8
  6449.         DC.W    DIPack-ToolTraps    ; 1E9 Pack2
  6450.         DC.W    SFPack-ToolTraps    ; 1EA Pack3
  6451.         DC.W    SANEPack-ToolTraps    ; 1EB Pack4
  6452.         DC.W    ElemsPack-ToolTraps    ; 1EC Pack5
  6453.         DC.W    IUPack-ToolTraps    ; 1ED Pack6
  6454.         DC.W    BDPack-ToolTraps    ; 1EE Pack7
  6455.         DC.W    PtrAndHand-ToolTraps    ; 1EF PtrAndHand
  6456.         DC.W    JTPC-ToolTraps        ; 1F0 LoadSeg
  6457.         DC.W    JT0-ToolTraps        ; 1F1 UnloadSeg
  6458.         DC.W    Launch-ToolTraps    ; 1F2 Launch
  6459.         DC.W    Chain-ToolTraps        ; 1F3 Chain
  6460.         DC.W    0        ; 1F4
  6461.         DC.W    GetAppParms-ToolTraps    ; 1F5 GetAppParms
  6462.         DCB.W    $1FD-$1F6,0    ; 1F6-1FC
  6463.         DC.W    GetScrap-ToolTraps    ; 1FD GetScrap
  6464.         DC.W    OddAddress0-ToolTraps    ; 1FE PutScrap
  6465.         DC.W    0        ; 1FF
  6466.  
  6467.  
  6468.         ;#############################
  6469.         ;##                         ##
  6470.         ;##  TMON patching section  ##
  6471.         ;##                         ##
  6472.         ;#############################
  6473.  
  6474. ;+------------------------------------------------+
  6475. ;| Find an area to patch in the main code of TMON |
  6476. ;+------------------------------------------------+
  6477. ;|
  6478. ;|ENTRY: FindInTMON
  6479. ;|
  6480. ;|IN:   D0,D1    8 bytes to find in TMON's code
  6481. ;|
  6482. ;|OUT:  Z    set if found, clear if not found
  6483. ;|    A0'    location of bytes in TMON code
  6484. ;|
  6485. ;|Destroys A0,A1.
  6486. ;|
  6487.  
  6488. FindInTMON
  6489.         MOVE.L    TMONStart,A0        ;Start at the beginning of TMON.
  6490.         LEA    A,A1            ;End at the beginning of the user area.
  6491.  
  6492. @1        ADDQ    #2,A0            ;(we can skip the WH at the beginning)
  6493.         CMP.L    A0,A1
  6494.         BLS.S    NotFoundInTMON
  6495.         CMP.L    (A0),D0            ;Found?
  6496.         BNE.S    @1
  6497.         CMP.L    4(A0),D1        ;Be sure that 8 bytes match.
  6498.         BNE.S    @1
  6499. FoundInTMON
  6500.         RTS
  6501. NotFoundInTMON
  6502.         MOVEQ    #1,D0            ;To set the CC's to non-zero
  6503.         RTS
  6504.  
  6505.  
  6506. SavedBytes    EQU    $C0            ;C0 bytes are saved after ScrnBase.
  6507.  
  6508. SavedScreen    LONG    0            ;This is the start of the saved screen.
  6509. SaveMode    DC    0            ;This is the screen saving mode.
  6510. MenuTop        DC    0            ;This is the row of the top of the TMON menu.
  6511. MenuBottom    DC    0            ;This is the row of the menu.
  6512.  
  6513. SeeThroughPatch
  6514.         LEA    A,A2            ;As usual, we like A2 pointing to the User Area.
  6515.  
  6516.         MOVEQ    #3,D0            ;Three lines above TMON chars.
  6517.         MULU    ScreenRow,D0
  6518.         MOVE.W    D0,MenuTop-A(A2)
  6519.  
  6520.         MOVE.W    #19,D0            ;Twenty rows of the Menu Bar
  6521.         MULU    ScreenRow,D0        ;Calculate the offset of the address of the start.
  6522.         MOVE.W    D0,MenuBottom-A(A2)
  6523.  
  6524.         MOVE.L    TMONStart,A4        ;($FC) is the start of TMON.
  6525.         MOVE.L    4(A4),A0        ;(4($FC)) is where a lot of info resides.
  6526.  
  6527.         MOVE.W    (A0)+,D0        ;This is the actual user area size (not necessarily = AreaSize).
  6528.         LEA    SavedBytes(A2),A3    ;The saved screen starts after the saved bytes.
  6529.         ADD.W    D0,A3
  6530.         MOVE.L    A3,SavedScreen-A(A2)
  6531.  
  6532.         MOVE.W    (A0)+,D1        ;This is the screen saving mode.
  6533.         MOVE.W    D1,SaveMode-A(A2)
  6534.  
  6535.         TST.W    D1            ;What is the screen mode?
  6536.         BNE.S    NotFullScreen
  6537.  
  6538.         ;Now, we make the patch that allows the screen to be transparent, if screen saving is on full.
  6539.  
  6540.         ;This is the original routine we are patching:
  6541.         ;7607            MOVEQ    #7,D3
  6542.         ;20C1        @1    MOVE.L    D1,(A0)+
  6543.         ;20C1            MOVE.L    D1,(A0)+
  6544.         ;51CB FFF8        DBRA    D3,@1
  6545.  
  6546.         MOVE.L    #$760720C1,D0        ;This is the first 4 bytes of the routine.
  6547.         MOVE.L    #$20C151CB,D1        ;These are the next 4.
  6548.  
  6549.         BSR    FindInTMON
  6550.         BNE.S    @1
  6551.  
  6552.         ;The patch routine is:
  6553.         ;4EB9 ???? ????        JSR    ScreenPatch
  6554.         ;4E71            NOP
  6555.         ;4E71            NOP
  6556.  
  6557.         MOVE.W    #$4EB9,(A0)+
  6558.         LEA    ScreenPatch,A1        ;Calculate the address for JSR
  6559.         MOVE.L    A1,(A0)+
  6560.         MOVE.L    #$4E714E71,(A0)+
  6561. @1
  6562.  
  6563. NotFullScreen
  6564.  
  6565.         RTS
  6566.  
  6567.  
  6568. ScreenPatch
  6569.         MOVE.L    A0,A1            ;Let's calcuate an address.
  6570.         SUB.L    ScrnBase,A1        ;Make an offset from the start of the screen.
  6571.  
  6572.         CMP.W    MenuTop,A1        ;Check if it is above the menu.
  6573.         BLO.S    NormalFill
  6574.         CMP.W    MenuBottom,A1        ;Check if it is below the menu.
  6575.         BHS.S    NormalFill
  6576.  
  6577. BlackFill    MOVEQ    #$FFFFFFFF,D1
  6578.         BRA.S    FillLine
  6579. WhiteFill    MOVEQ    #$00000000,D1
  6580. NormalFill
  6581.         CMP.L    #$AFFFFFFF,D1        ;$AAAAAAAA>$AFFFFFFF<-$55555555
  6582.         BMI.S    ShowThrough        ;Show through if it is A's or 5's
  6583. FillLine
  6584.         MOVEQ    #15,D3            ;This is the original fill routine
  6585. @1        MOVE.L    D1,(A0)+
  6586.         DBRA    D3,@1
  6587.         RTS
  6588.  
  6589. ShowThrough
  6590.         ADD.L    SavedScreen,A1        ;Point to the saved screen.
  6591.  
  6592.         MOVEQ    #15,D3            ;Allow the application to show through.
  6593. @1        MOVE.L    (A1)+,(A0)+
  6594.         DBRA    D3,@1
  6595.         RTS
  6596.  
  6597.  
  6598. DebuggerPatch
  6599.         ;This patch allows TMON to step through the _Debugger opcode.
  6600.  
  6601.         ;This is the original routine we are patching:
  6602.         ;0240 F9FF        AND.W    #$F9FF,D0
  6603.         ;0C40 A9FF        CMP.W    #$A9FF,D0
  6604.  
  6605.         MOVE.L    #$0240F9FF,D0        ;This is the first 4 bytes of the routine.
  6606.         MOVE.L    #$0C40A9FF,D1        ;These are the next 4.
  6607.  
  6608.         BSR    FindInTMON
  6609.         BNE.S    @1
  6610.  
  6611.         ;The patch routine is:
  6612.         ;0240 F9FF        AND.W    #$F9FF,D0
  6613.         ;0C40 FFFF        CMP.W    #$FFFF,D0
  6614.  
  6615.         MOVE.B    #$FF,6(A0)
  6616. @1
  6617.         RTS
  6618.  
  6619.  
  6620. GetTrapAddressPatch
  6621.         ;This patch allows TMON to work with the original HyperDrive
  6622.         ;20 software (subsequently fixed by GCC) and some other software
  6623.         ;that patches _GetTrapAddress and does not preserve register A2.
  6624.  
  6625.         ;This is the recognition for the original routine:
  6626.         ;2F0A            MOVE.L    A2,-(A7)
  6627.         ;2602            MOVE.L    D2,D3
  6628.         ;7046            MOVEQ    #GetTrapAddress,D0
  6629.         ;A146            _GetTrapAddress
  6630.  
  6631.         MOVE.L    #$2F0A2602,D0        ;This is the first 4 bytes of the recognizer routine.
  6632.         MOVE.L    #$7046A146,D1        ;These are the next 4.
  6633.  
  6634.         BSR    FindInTMON
  6635.         BNE.S    @1
  6636.  
  6637.         ;Changes go here: A2 to A3
  6638.  
  6639.         ;0000:    2F0A            MOVE.L    A2,-(A7)
  6640.         ;    2F0B            MOVE.L    A3,-(A7)
  6641.  
  6642.         MOVE.W    #$2F0B,$0000(A0)
  6643.  
  6644.         ;0008:    2448            MOVE.L    A0,A2
  6645.         ;    2648            MOVE.L    A0,A3
  6646.  
  6647.         MOVE.W    #$2648,$0008(A0)
  6648.  
  6649.         ;0018:    4E92            JSR    (A2)
  6650.         ;0018:    4E93            JSR    (A3)
  6651.  
  6652.         MOVE.W    #$4E93,$0018(A0)
  6653.  
  6654.         ;002A:    245F            MOVE.L    (A7)+,A2
  6655.         ;002A:    265F            MOVE.L    (A7)+,A3
  6656.  
  6657.         MOVE.W    #$265F,$002A(A0)
  6658. @1
  6659.         RTS
  6660.  
  6661.  
  6662.         ;#############################
  6663.         ;##                         ##
  6664.         ;##  Cursor fixing section  ##
  6665.         ;##                         ##
  6666.         ;#############################
  6667.  
  6668.  
  6669. FirstSaved    EQU    ScrnBase
  6670. LastSaved    EQU    FirstSaved+SavedBytes
  6671. SavedBase    EQU    ScrnBase-LastSaved(A3)
  6672. SavedTemp    EQU    MTemp-LastSaved(A3)
  6673. SavedRaw    EQU    RawMouse-LastSaved(A3)
  6674. SavedMouse    EQU    Mouse-LastSaved(A3)
  6675. SavedPin    EQU    CrsrPin-LastSaved(A3)
  6676. CrsrPin.    EQU    CrsrPin+4
  6677. SavedPin.    EQU    CrsrPin.-LastSaved(A3)
  6678. SavedRect    EQU    CrsrRect-LastSaved(A3)
  6679. SavedCursor    EQU    TheCrsr-LastSaved(A3)
  6680. SavedAddr    EQU    CrsrAddr-LastSaved(A3)
  6681. SavedSave    EQU    CrsrSave-LastSaved(A3)
  6682. SavedVis    EQU    CrsrVis-LastSaved(A3)
  6683. SavedBusy    EQU    CrsrBusy-LastSaved(A3)
  6684. SavedNew    EQU    CrsrNew-LastSaved(A3)
  6685. SavedCouple    EQU    CrsrCouple-LastSaved(A3)
  6686. SavedState    EQU    CrsrState-LastSaved(A3)
  6687. SavedObscure    EQU    CrsrObscure-LastSaved(A3)
  6688. SavedScale    EQU    CrsrScale-LastSaved(A3)
  6689. SavedMask    EQU    MouseMask-LastSaved(A3)
  6690. SavedOffset    EQU    MouseOffset-LastSaved(A3)
  6691.  
  6692. ;
  6693. ;This fixes up the way the cursor works in TMON.
  6694. ;
  6695.  
  6696. CursorEnter
  6697.         LEA    A,A2            ;Point to A as usual.
  6698.         MOVE.L    SavedScreen,A3        ;Point A3 to the saved cursor globals.
  6699.  
  6700.         TST.W    SaveMode-A(A2)        ;Check out save mode.
  6701.         BNE.S    @1
  6702.         TST.B    SavedBusy        ;If a cursor routine is executing,
  6703.         BNE.S    @1            ;don't play with the cursor.
  6704.         TST.B    SavedVis        ;If the cursor was not visible,
  6705.         BEQ.S    @1            ;don't play with it.
  6706.         TST.B    SavedCouple        ;If the cursor is not coupled,
  6707.         BEQ.S    @1            ;don't play with it.
  6708.  
  6709.         MOVE.B    #1,CrsrBusy        ;Mark the cursor busy.
  6710.  
  6711.         LEA    SavedRect,A0        ;Restore the old cursor rectangle.
  6712.         LEA    CrsrRect,A1
  6713.         MOVE.L    (A0)+,(A1)+
  6714.         MOVE.L    (A0),(A1)
  6715.  
  6716.         MOVE.L    SavedAddr,D1        ;Get the old cursor address.
  6717.         MOVE.L    D1,D0
  6718.         SUB.L    ScrnBase,D0
  6719.         ADD.L    SavedScreen,D0
  6720.         MOVE.L    D0,CrsrAddr        ;Modify it to point to the buffer.
  6721.  
  6722.         LEA    SavedSave,A0        ;Get the saved bytes.
  6723.         LEA    CrsrSave,A1        ;Into the real bytes.
  6724.         MOVE.L    #4*16,D0
  6725.         _BlockMove
  6726.  
  6727.         SUB.W    #1,SavedState        ;Subtract 1 to indicated Hiding.
  6728.  
  6729.         PEA    @1
  6730.         MOVE.L    JShowCursor,-(SP)
  6731.         MOVE.L    JHideCursor,-(SP)
  6732.         RTS
  6733. @1
  6734.         ST    CrsrCouple        ;Now, make sure the cursor can be used.
  6735.         MOVEQ    #-1,D0
  6736.         MOVE.L    D0,MouseMask
  6737.         CLR.L    MouseOffset
  6738.  
  6739.         RTS                ;Continue with the Record routine.
  6740.  
  6741. CursorExit
  6742.         LEA    A,A2            ;Point to A as usual.
  6743.         MOVE.L    SavedScreen,A3        ;Point A3 to the saved cursor globals.
  6744.  
  6745.         TST.W    SaveMode-A(A2)        ;Check out save mode.
  6746.         BNE    @1
  6747.         TST.B    SavedBusy        ;If a cursor routine is executing,
  6748.         BNE    @1            ;don't play with the cursor.
  6749.         TST.B    SavedCouple        ;If the mouse is not coupled to the cursor,
  6750.         BEQ    @1            ;don't move it.
  6751.  
  6752.         MOVE.B    #1,CrsrBusy        ;Mark the cursor busy.
  6753.  
  6754.         CLR.B    CrsrVis            ;Fix up some variables.
  6755.         MOVE.W    SavedState,CrsrState
  6756.         MOVE.L    SavedMask,MouseMask
  6757.         MOVE.L    SavedOffset,MouseOffset
  6758.         LEA    SavedPin,A0        ;Get the pin rectangle and the cursor.
  6759.         LEA    CrsrPin,A1
  6760.         MOVE.L    #2*8+2*(2*16)+4,D0
  6761.         _BlockMove
  6762.  
  6763.         MOVE.L    RawMouse,D0        ;Get the current mouse address.
  6764.         BSR.S    DoPinStuff
  6765.         MOVE.L    D0,RawMouse        ;Save it as Raw and Temp.
  6766.         MOVE.L    D0,MTemp
  6767.         AND.L    MouseMask,D0        ;Mask it.
  6768.         MOVE.L    MouseOffset,D1        ;Offset it?
  6769.         BEQ.S    @3
  6770.         ADD.L    D1,D0            ;yes.
  6771.         BSR.S    DoPinStuff
  6772. @3        MOVE.L    D0,Mouse
  6773.         CLR.B    CrsrNew
  6774.         CLR.B    CrsrObscure
  6775.         TST.B    SavedObscure        ;If it was obscured,
  6776.         BEQ.S    @4
  6777.         SNE    SavedVis        ;pretend it was visible.
  6778. @4
  6779.         TST.B    SavedVis        ;Was it visible when we entered?
  6780.         BEQ.S    @5
  6781.  
  6782.         MOVE.L    SavedScreen,ScrnBase    ;Fake out the screen.
  6783.         CLR.W    CrsrState        ;(just to make sure)
  6784.         PEA    @2
  6785.         MOVE.L    JShowCursor,-(SP)
  6786.         RTS
  6787. @2
  6788.         MOVE.B    #1,CrsrBusy
  6789.         MOVE.L    CrsrAddr,D0        ;Get the address of saved data.
  6790.         SUB.L    ScrnBase,D0        ;Subtract the value of the screen.
  6791.         ADD.L    SavedBase,D0        ;Add the value of the real screen.
  6792.         MOVE.L    D0,CrsrAddr        ;Set that address.
  6793. @5
  6794.         LEA    MTemp,A0        ;Restore the variables.
  6795.         LEA    SavedTemp,A1        ;Store over the saved variables.
  6796.         MOVE.L    #SavedBytes-4,D0    ;Restore all but the ScrnBase.
  6797.         _BlockMove
  6798.  
  6799.         CLR.B    SavedBusy
  6800.         CLR.B    CrsrBusy
  6801. @1
  6802.         RTS
  6803.  
  6804. DoPinStuff
  6805.         CMP.W    left(A0),D0        ;This routine is copied out of the ROM
  6806.         BGE.S    @1
  6807.         MOVE.W    left(A0),D0
  6808. @1
  6809.         CMP.W    right(A0),D0
  6810.         BLE.S    @2
  6811.         MOVE.W    right(A0),D0
  6812.         SUBQ.W    #1,D0
  6813. @2
  6814.         SWAP    D0
  6815.  
  6816.         CMP.W    top(A0),D0
  6817.         BGE.S    @3
  6818.         MOVE.W    top(A0),D0
  6819. @3
  6820.         CMP.W    bottom(A0),D0
  6821.         BLE.S    @4
  6822.         MOVE.W    bottom(A0),D0
  6823.         SUBQ.W    #1,D0
  6824. @4
  6825.         SWAP    D0
  6826.  
  6827.         RTS
  6828.  
  6829.  
  6830.         ;#####################
  6831.         ;##                 ##
  6832.         ;##  Odds and Ends  ##
  6833.         ;##                 ##
  6834.         ;#####################
  6835.  
  6836.  
  6837. ;
  6838. ;The following makes the _Debugger trap work properly.
  6839. ;
  6840.  
  6841. Debugger    EQU    $1FF
  6842.  
  6843. DebuggerInit
  6844.         MOVEQ    #12,D0
  6845.         _NewPtr,Sys
  6846.  
  6847.         MOVE.L    A0,A1
  6848.         MOVE.W    #$4EF9,(A0)+        ;JMP ABS.L
  6849.         LEA    DebuggerIntercept,A3
  6850.         MOVE.L    A3,(A0)+
  6851.  
  6852.         MOVE.L    A0,A2
  6853.         MOVE.W    #$4EF9,(A0)+        ;JMP ABS.L
  6854.         LEA    UndefinedIntercept,A3
  6855.         MOVE.L    A3,(A0)+
  6856.  
  6857.         MOVE.W    #Debugger,D0
  6858.         _GetTrapAddress
  6859.         MOVE.L    A0,A3
  6860.  
  6861.         MOVE.W    #Debugger,D0
  6862.         MOVE.L    A1,A0
  6863.         _SetTrapAddress
  6864.  
  6865.         MOVE.W    #Debugger-1,D1        ;All traps except _Debugger
  6866. FixUndefined
  6867.         MOVE.W    D1,D0
  6868.         _GetTrapAddress
  6869.         CMP.L    A0,A3            ;Same as Debugger?
  6870.         BNE.S    @1
  6871.  
  6872.         MOVE.W    D1,D0
  6873.         MOVE.L    A2,A0
  6874.         _SetTrapAddress
  6875. @1
  6876.         DBRA    D1,FixUndefined
  6877.  
  6878.         RTS
  6879.  
  6880. DebuggerIntercept
  6881.         MOVE.W    SR,-(SP)
  6882.         MOVEM.L    A0/A1,-(SP)
  6883.         MOVE.L    10(SP),A0
  6884.         CMP.L    TMONStart,A0
  6885.         BLO.S    @1
  6886.         LEA    EndUserArea,A1
  6887.         CMP.L    A1,A0
  6888.         BHS.S    @1
  6889.         MOVEM.L    (SP)+,A0/A1
  6890.         MOVE.W    (SP)+,SR
  6891.         RTS
  6892. @1
  6893.         MOVEM.L    (SP)+,A0/A1
  6894.         TRAPMon    '_Debugger'
  6895.  
  6896. UndefinedIntercept
  6897.         MOVE.W    SR,-(SP)
  6898.         MOVEM.L    A0/A1,-(SP)
  6899.         MOVE.L    10(SP),A0
  6900.         CMP.L    TMONStart,A0
  6901.         BLO.S    @1
  6902.         LEA    EndUserArea,A1
  6903.         CMP.L    A1,A0
  6904.         BHS.S    @1
  6905.         MOVEM.L    (SP)+,A0/A1
  6906.         MOVE.W    (SP)+,SR
  6907.         RTS
  6908. @1
  6909.         MOVEM.L    (SP)+,A0/A1
  6910.         TRAPMon    'Undefined A-trap'
  6911.  
  6912.  
  6913. ;
  6914. ;The following makes Free Form sound work properly.
  6915. ;
  6916.  
  6917. VInstall    EQU    $33
  6918.  
  6919. FreeFormPatch
  6920.         MOVE.W    #VInstall,D0
  6921.         _GetTrapAddress
  6922.         CMP.W    #$6D1A,$34(A0)        ;If it is the correct BLT.S
  6923.         BNE.S    DontPatchFreeForm
  6924.         MOVE.B    #$60,$34(A0)        ;Make it a BRA.S
  6925. DontPatchFreeForm
  6926.         RTS
  6927.  
  6928.  
  6929. ;
  6930. ;The following allows the AppleTalk interface code to work properly.
  6931. ;
  6932.  
  6933. AppleTalkPatch
  6934.         MOVE.B    #1,$E0            ;Don't ask.
  6935.         RTS
  6936.  
  6937.  
  6938. ;
  6939. ;The following saves MemTop so it is valid later.  It seems Switcher likes
  6940. ;to mess with it.
  6941. ;
  6942.  
  6943. SaveMemTop
  6944.         LEA    RealMemTop,A0
  6945.         MOVE.L    MemTop,(A0)
  6946.         RTS
  6947.  
  6948. RealMemTop    LONG    0
  6949.  
  6950.  
  6951.         ;##################################
  6952.         ;##                              ##
  6953.         ;##  End of User Area (padding)  ##
  6954.         ;##                              ##
  6955.         ;##################################
  6956.  
  6957.  
  6958.         DCB.B    AreaSize+A-*,0        ;Fill out user area to a even multiple of 256
  6959. EndUserArea
  6960.  
  6961.         END
  6962.